Azure DevOps管道在构建验证时触发两次

5
我在我的代码库中创建了一个流水线,用于通过执行单元测试来验证被推送到features/*分支的代码。同样的流水线也被设置为构建验证流水线,作为develop分支上的分支策略来验证传入的PRs。这是触发流水线的方式。
# pipeline.yml
trigger:
  batch: false
  branches:
    include:
      - features/*

然而,我们遇到了以下情况:给定一个来自 refs/heads/features/azure-pipelines -> refs/heads/develop 的开放式 PR,我们在 features/azure-pipelines 分支上推送一个提交。

这会导致管道触发两次。据我理解,其中一个运行是由管道触发引起的(屏幕截图上标记为“Individual CI”的那个),第二个运行是由分支策略尝试验证被推送到开放式 PR 到 develop 的代码引起的。(PR 自动化)

enter image description here

有没有办法禁用其中一个执行,因为它本质上是重复的?我可能正在寻找一种检索打开的 PR 并在分支上存在打开的 PR 的情况下中止 Individual CI 管道执行的方法,但我不确定这是否是解决该问题的最佳方式,并且正在寻找其他选项。
5个回答

3

您可以进行设置

trigger: none

仅有分支策略将会触发此流水线。


嗯,按照这种方式,只有在打开拉取请求时才会构建分支。在我看来,这太晚了,应该在没有拉取请求的情况下构建分支。 - undefined

1

有没有办法禁用其中一个执行,因为它基本上是重复的?

我们知道,除非我们取消Build验证,否则无法禁用设置为分支策略的Build验证管道来验证传入的PRs。

对于您的情况,您可以尝试在HEAD提交的提交消息或说明中包含[skip ci],以使Azure Pipelines在计划将功能分支合并到develop分支时跳过运行CI。

您可以查看文档Skipping CI for individual commits以获取更多详细信息。


1
这不是最优雅的解决方案,因为我们更喜欢一个自动化的解决方案,但它能完成工作,所以我接受了这个。 - undefined

0

这取决于它们是否相同。您可以在管道中进行条件检查,对PR和CI运行执行不同的操作。但是,我非常确定这是不可能的,因为一个是在YAML上定义的,另一个是在Azure DevOps门户上定义的。因此,即使您在YAML中禁用了PR触发器,在分支策略中仍然会运行PR。而且,您可以在YAML中指定任何内容来阻止分支策略。


0
我遇到了同样的问题。为了解决这个问题,在你的trigger.branches.include中,你只需要放置构建分支,而不是在拉取请求中使用的分支(例如features/*)。
# pipelines.yml
trigger:
  batch: false
  branches:
    include:
      - master
      - dev

stages:
  - stage: test
    jobs:
      template: unit-test-jobs.yml
  - stage: deploy
    condition: ne(variables['Build.Reason'], 'PullRequest')
    jobs: ...

这样,您的流水线将在拉取请求时运行,并在推送到您的分支(如上例中的masterdev)时运行新提交。


2
在我看来,最大的缺点是,功能/分支在你打开拉取请求之前不会构建。 - undefined
@MarkusSchulte 这在我们团队中运行得很好。我们有很多开发人员,不希望在“工作中的提交”中运行流水线。一些开发人员在发起拉取请求之前会进行20多次提交。这将浪费资源并进行不必要的运行。 - undefined

0
trigger:
- master #probably name of your default branch

来自https://learn.microsoft.com/en-us/azure/devops/release-notes/2019/sprint-146-update#avoid-triggering-multiple-ci-builds-for-pull-requests

Azure Pipelines中包含的YAML构建模板被配置为触发存储库中任何分支的构建。这包括拉取请求主题分支。因此,当创建拉取请求时,会触发两个构建。一个是响应于持续集成触发器的拉取请求分支的构建,另一个是响应于拉取请求触发器的拉取请求分支的构建。

通过使用下面的YAML片段,内置的YAML模板将被配置为仅为主分支触发持续集成构建。新的拉取请求仍将使用拉取请求触发器进行构建。有关更多详细信息,请参阅构建管道触发器文档。


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