如何在 vNext 中的 Pull Request 构建期间推断合并目标分支?
How to deduce the merge target branch during the Pull Request build in vNext?
我们正在将我们的代码从 TFS 版本控制迁移到 Git(由 TFS 托管)。迁移的一部分是设置合并请求构建。
我们使用 TFS vNext CI 框架。
我们让它工作,当创建合并请求时,构建会按预期开始。
例如,这是构建开始后 PR 构建服务器上的 Git 存储库历史记录的样子:
PS D:\_wf\s> git lg -5
* 92d0a7efc | (HEAD, pull/505/merge) Merge pull request 505 from canws211_master1 into master (2 hours ago) [Lopyreva, Valeria]
|\
| * 37103b362 | (origin/canws211_master1) test (16 hours ago) [Lopyreva, Valeria]
| * ca6601027 | test (17 hours ago) [Lopyreva, Valeria]
* | 50045719d | (origin/master) Merged PR 504: Fix the path references. (2 hours ago) [Kharitonov, Mark]
|\ \
| * | bf3814458 | (origin/shelve_test) Fix the path references. (18 hours ago) [Kharitonov, Mark]
PS D:\_wf\s>
PR 构建的一个非常重要的逻辑是找出哪些文件被 Pull Request 触及。鉴于上面的例子,这可以这样确定:
PS D:\_wf\s> git diff-tree --name-status origin/master..
M Build
现在,问题来了。我如何从构建本身推断合并目标?
我可以定义一个专用的构建参数并在那里传递合并目标。但我觉得这是错误的。合并目标应该以某种方式可用。
有什么想法吗?
编辑 1
正在尝试澄清。构建脚本需要知道在 Pull Request 中修改了哪些文件。方法是:
git diff-tree --name-status -r <MERGE_TARGET>..
其中 <MERGE_TARGET>
应替换为合并目标。所以,如果 PR 是给 master 的,那么它将是 origin/master
。但是如果它是用于名为 YabaDabaDoo 的分支,那么它将是 origin/YabaDabaDoo
。我的问题是我想从 vNext Git 构建中自动推断合并目标。
您可以使用 REST API 获取 PR 信息,其中包括源分支和目标分支。
我们最终放置了以下内联 powershell 脚本:
$TargetBranch = $env:SYSTEM_PULLREQUEST_TARGETBRANCH
if ($TargetBranch)
{
$TargetBranch = $TargetBranch.Split('/')[-1]
}
else
{
$TargetBranch = $env:BUILD_SOURCEBRANCHNAME
}
Write-Host "##vso[task.setvariable variable=branch]$(git remote show -n)/$TargetBranch"
这会生成一个 branch
变量,因此 $(branch)
正好等于我们需要的。
我们正在将我们的代码从 TFS 版本控制迁移到 Git(由 TFS 托管)。迁移的一部分是设置合并请求构建。
我们使用 TFS vNext CI 框架。
我们让它工作,当创建合并请求时,构建会按预期开始。
例如,这是构建开始后 PR 构建服务器上的 Git 存储库历史记录的样子:
PS D:\_wf\s> git lg -5
* 92d0a7efc | (HEAD, pull/505/merge) Merge pull request 505 from canws211_master1 into master (2 hours ago) [Lopyreva, Valeria]
|\
| * 37103b362 | (origin/canws211_master1) test (16 hours ago) [Lopyreva, Valeria]
| * ca6601027 | test (17 hours ago) [Lopyreva, Valeria]
* | 50045719d | (origin/master) Merged PR 504: Fix the path references. (2 hours ago) [Kharitonov, Mark]
|\ \
| * | bf3814458 | (origin/shelve_test) Fix the path references. (18 hours ago) [Kharitonov, Mark]
PS D:\_wf\s>
PR 构建的一个非常重要的逻辑是找出哪些文件被 Pull Request 触及。鉴于上面的例子,这可以这样确定:
PS D:\_wf\s> git diff-tree --name-status origin/master..
M Build
现在,问题来了。我如何从构建本身推断合并目标?
我可以定义一个专用的构建参数并在那里传递合并目标。但我觉得这是错误的。合并目标应该以某种方式可用。
有什么想法吗?
编辑 1
正在尝试澄清。构建脚本需要知道在 Pull Request 中修改了哪些文件。方法是:
git diff-tree --name-status -r <MERGE_TARGET>..
其中 <MERGE_TARGET>
应替换为合并目标。所以,如果 PR 是给 master 的,那么它将是 origin/master
。但是如果它是用于名为 YabaDabaDoo 的分支,那么它将是 origin/YabaDabaDoo
。我的问题是我想从 vNext Git 构建中自动推断合并目标。
您可以使用 REST API 获取 PR 信息,其中包括源分支和目标分支。
我们最终放置了以下内联 powershell 脚本:
$TargetBranch = $env:SYSTEM_PULLREQUEST_TARGETBRANCH
if ($TargetBranch)
{
$TargetBranch = $TargetBranch.Split('/')[-1]
}
else
{
$TargetBranch = $env:BUILD_SOURCEBRANCHNAME
}
Write-Host "##vso[task.setvariable variable=branch]$(git remote show -n)/$TargetBranch"
这会生成一个 branch
变量,因此 $(branch)
正好等于我们需要的。