Azure DevOps - 仅允许特定分支合并到主分支

7

我所在项目的分支设置希望强制规定只有dev分支才能合并到master分支。

是否可以通过分支策略来设置? 如果不行,是否还有其他替代方案?

我们试图防止任何开发人员试图从错误的分支合并到master分支。

感谢任何帮助。

1个回答

11
有没有办法使用分支策略来设置这个?如果不行,还有其他的替代方法吗?
Azure DevOps没有控制哪个分支可以合并到主分支的选项,但我们可以使用分支策略作为解决方法。以下是我的工作方向:
第一步。创建一个简单的流水线(无论是传统的还是yaml格式,但对于这种情况来说,传统的更合适),里面包含一个命令行任务:
脚本:ThisIsNotDevBranch.exe test
在标准错误上失败:enter image description here 运行任务时的条件:enter image description here Yaml 格式:
steps:

- script: 'ThisIsNotDevBranch.exe test'
  failOnStderr: true
  displayName: 'Command Line Script'
  condition: ne(variables['System.PullRequest.SourceBranch'], 'refs/heads/dev')

Step2. 配置master分支的分支策略,在设置中添加 构建策略

图像描述

选择在步骤1中创建的流水线作为构建策略所使用的流水线。

工作原理:

1. 每当我创建一个pull request来合并一个分支到master分支时,就会自动触发在步骤1中创建的流水线。

2. 我使用了CMD任务中实际上不存在的命令,并勾选了“Fail On Standard Error”复选框。然后这个任务将会抛出错误并且使任务,如果运行,则使流水线失败。

3. 在该任务中使用条件,只有当PR的源分支是dev分支(refs/heads/dev)时,该任务才会运行。

4. 现在如果我创建一个PR来将分支testBranch合并到master=>流水线运行=>自定义条件=true=>任务运行,然后它抛出错误使流水线失败=>此时无法完成PR(如果流水线失败,则无法工作完成按钮)。

然后,如果我创建一个PR来将分支dev合并到master=>流水线运行=>条件=false=>任务将跳过=>流水线成功=>我们可以批准和完成PR。

注意:

1. 如果您想要设置只有dev分支可以合并到master分支,请在条件中使用refs/heads/dev。如果是Dev,则请改为refs/heads/Dev

2. 这个方案的核心是有条件的CMD任务,我们可以用其他类型的任务替换它。此外,我们不必创建一个流水线来运行这个任务。如果您想要,只需在现有的流水线中添加有条件的任务即可。但是需要额外的步骤来区分流水线是由PR还是普通更新的源文件触发。因此,我建议创建一个新的简单经典流水线来进行验证。

附加说明:

1. System.PullRequest.SourceBranch的详细信息。

2. 除了构建策略之外,您还可以在分支策略中尝试其他策略来保护您的主分支。就像Krzysztof Madej所说,您还可以考虑代码审核人选项。将这些策略选项组合起来是一个不错的选择!


这个方法可以运行,但考虑到这是一个相对常见的需求,这种方法似乎有些过度设计了。 - liang
关于这种情况怎么办呢:我创建了一个拉取请求,但由于某种原因(比如我忘记在提交中包含一个文件),管道失败了。我修复了错误,管道再次运行。System.PullRequest.SourceBranch现在为空。我该如何解决这个问题? - kkuilla
我知道这很老,而且我可能很蠢,但是我在第一步上失败得非常惨。我看不到任何这些选项。当我选择经典时,它需要我配置我完全不了解的内容。当我通过yaml进行操作时,我可以完成它,但是它会抱怨没有触发器。 - MattyMatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接