代码之家  ›  专栏  ›  技术社区  ›  mark

在VNext中构建拉请求时,如何推断合并目标分支?

  •  0
  • mark  · 技术社区  · 6 年前

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

    我们使用tfs-vnext-ci框架。

    我们让它工作,当一个拉请求被创建时,构建就如预期的那样开始了。

    例如,在构建开始后,pr build服务器上的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请求访问。对于上面的示例,可以这样确定:

    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> 应替换为合并目标。所以,如果公关是为大师,那么它将是 origin/master . 但如果是一个叫Yabadabadoo的分支,那么它应该是 origin/YabaDabaDoo . 我的问题是,我想从VNextGit构建中自动推断合并目标。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Daniel Mann    6 年前
        2
  •  0
  •   mark    6 年前

    $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)