如何在vNext中的Pull Request构建期间推断合并目标分支?

时间:2018-07-06 15:15:32

标签: git tfs build pull-request

我们正在将代码从TFS版本控件迁移到Git(由TFS托管)。迁移的一部分是设置“拉取请求”构建。

我们使用TFS vNext CI框架。

我们可以正常工作,当创建请求请求时,构建将按预期开始。

例如,这是PR生成服务器上的Git存储库历史记录在生成开始后的样子:

PS D:\_wf\02\1\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\02\1\s>

PR构建的一个非常重要的逻辑是找出Pull Request涉及哪些文件。在上述示例中,可以这样确定:

PS D:\_wf\02\1\s> git diff-tree --name-status origin/master..
M       Build

现在是问题所在。如何从构建本身推断合并目标?

我可以定义一个专用的构建参数,并在此处传递合并目标。但是我觉得这是错误的。合并目标应该以某种方式可用。

有什么想法吗?

编辑1

试图澄清。构建脚本需要知道在请求请求中修改了哪些文件。这样做的方法是:

git diff-tree --name-status -r <MERGE_TARGET>..

<MERGE_TARGET>替换为合并目标的位置。因此,如果PR用于主站,则它将为origin/master。但是,如果它是针对名为YabaDabaDoo的分支的,则它将为origin/YabaDabaDoo。我的问题是我想从vNext Git构建中自动推断出合并目标。

2 个答案:

答案 0 :(得分:0)

您可以使用REST API获取PR信息,其中包括源分支和目标分支。

答案 1 :(得分:0)

我们最终放置了以下嵌入式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)等于我们需要的变量。