【问题标题】:Different merge strategies (automatically) based on the source branch基于源分支的不同合并策略(自动)
【发布时间】:2020-05-23 04:31:02
【问题描述】:

我们正在使用 Azure DevOps 的项目中采用 gitflow 流程。我有以下几种情况:

  1. 当功能分支合并到 Develop 中时,我想在完成拉取请求时强制执行 squash 合并策略
  2. 当 Release 分支定期同步回 Develop 时,我想强制执行 no-ff 合并,以保留 Release 分支签入历史记录

有两个问题:

  1. 鉴于我上面的两个要求,这是否表明我在分支和合并方面可能做错了什么

  2. AzDo 中是否有工具可以根据源分支(自动)提供不同的合并策略?

谢谢,

【问题讨论】:

  • 嗨@Chubsdad,您是否查看了以下脚本,如果有任何问题,请告诉我?
  • 嗨@Chubsdad,你正在尝试做的事情对我来说完全有意义 - 我们的组织中存在完全相同的问题,我正在寻找解决方案

标签: azure-pipelines azure-repos


【解决方案1】:

我认为目前在 ADO 中是​​不可能的。我找到了一张功能请求票,并在评论中留下了我的建议 - the feature request

这是我的评论的副本:

I think this feature would be awesome. Currently, is a stack overflow related to this problem:

https://stackoverflow.com/questions/60106638/different-merge-strategies-automatically-based-on-the-source-branch
Also, I’ve checked both UI and REST API looking for a way or a workaround to achieve this but to no avail.

My generalized suggestion would be to be able to create and attach ad-hoc policy to a PR to override a branch policy. This would allow a third party tool (and/or in UI) to override policy properties like “Limit merge types” based on PR properties like ‘source branch’. For instance, if a source branch is set to “feature/somefeature”, “Limit merge types” should be Squash only. Another example, if a source branch is “integration”, don’t allow Squash Merge.

作为替代方案,您可以使用ADO Service Hooks 在 PR 创建/修改时触发自定义应用程序(例如 Azure Functions),留下评论以提醒开发人员不要使用 Squash 合并类型。仅当 PR 的源分支是特定分支时,应用程序才能具有添加注释的逻辑。如果您的分支策略设置了Check for comment resolution,则开发人员将无法在不解决评论的情况下完成 PR。这不是您想要实现的(没有什么可以阻止开发人员使用无效的合并类型),但是,希望会减少这种情况的数量。 Here is an example of a custom branch policy in Azure Functions.

【讨论】:

    【解决方案2】:

    我看不出 gitflow 进程的上述分支和合并有什么问题。有关gitflow process 的更多信息,请查看此文档。

    没有直接的方法可以根据源分支自动选择不同的合并策略。解决方法是可以使用pull request update rest api 将pr 设置为autoComplete 并根据源分支设置合并策略。下面是一个示例供参考。

    1,首先创建一个构建管道并添加一个powershell任务以在脚本下运行。 您可以查看here 了解创建经典 ui 管道的步骤。对于 yaml 管道,您可以查看此document

    下面的脚本将根据 System.PullRequest.SourceBranch 并为此 pr 启用自动完成功能。这样pr在满足所有要求时会自动完成。 (您需要根据情况更改if(){} 部分)。

        $uri = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/git/repositories/$(Build.Repository.ID)/pullrequests/$(System.PullRequest.PullRequestId)?api-version=5.1"
    
        $response =  Invoke-RestMethod -Uri $uri -Headers @{authorization = "Bearer $(System.AccessToken)"} -Method get 
        $userid = $response.createdBy.id
        $merge =  "rebaseMerge"
    
        if("$(System.PullRequest.SourceBranch)" -eq "refs/heads/release"){$merge =  "noFastForward"}
    
        $body =@{
            autoCompleteSetBy = @{
            id= "$($userid)"
              }
            status = "complete"
            completionOptions= @{mergeStrategy = $merge}
         }
        $bjson = $body | ConvertTo-Json
    
        Invoke-RestMethod -Uri $uri -Headers @{authorization = "Bearer $(System.AccessToken)"} -Method patch -ContentType application/json -Body $bjson
    

    2、然后为开发分支配置branch policy。并选择上面创建的管道来设置build validation。通过设置构建验证,pr 将触发运行在上述步骤中创建的构建管道。以上管道会根据源分支改变合并策略。

    您也可以submit a feature request(单击建议功能并选择azure devops)将此工具用于Microsoft 开发。

    【讨论】:

    • 嗨Levi,我相信这不是作者想要实现的。这种方法不会阻止用户取消自动完成并使用不需要的合并类型。我相信他们希望有一个临时策略来限制某些基于 PR 属性(如源分支)的合并类型。感谢您的链接-我将创建一个功能请求
    猜你喜欢
    • 2016-10-05
    • 1970-01-01
    • 2010-12-04
    • 2015-11-20
    • 2011-08-08
    • 2016-12-10
    • 2021-07-25
    • 2016-08-12
    相关资源
    最近更新 更多