编辑2
微软最终改善了他们有关YAML中管道触发器的文档!这是链接。
编辑
在撰写答案后,Microsoft提出了另一种解决方案,通过使用经典管道上的构建完成触发器来解决此问题。可以在此处找到其解决方案。
如果不从触发管道发布工件,则不会触发触发的管道。
此类触发器的使用存在非常大的限制。需要更改“depends”管道中的“defaultBranch for manual and scheduled builds”到工作分支。否则它不会在“source”管道执行结束时启动。所以,假设您正在“feature”分支上工作,并且“defaultBranch”设置为“feature”。您提交代码,一切都将按预期运行:源管道启动,并在其结束时触发“depends”管道。一切顺利!但是当您合并到“master”时,如果您不更改“defaultBranch”,则“depends”管道不会在“source”管道执行结束时启动。我将在答案结尾解释如何更改“defaultBranch”。
如何设置管道触发器
在一个最小化的项目上,我成功运行了此项操作。这里您可以找到代码,这里是Azure DevOps上的项目。我将尝试为您提供指南并回答您在帖子中提出的问题。
我将称触发管道为“depends”管道,称触发器管道为“source”管道。
在“source”管道上,除了发布工件外,不需要做任何事情。如果您不从“source”管道发布工件,则不会起作用。下面是我使用的虚拟“source”管道代码。我希望它在“master”分支上触发,并确保在结束时发布工件。
trigger:
branches:
include:
- master
pr: none
steps:
- task: CopyFiles@2
inputs:
contents: $(System.DefaultWorkingDirectory)/**/*.yml
targetFolder: $(Build.ArtifactStagingDirectory)
- task: PublishBuildArtifacts@1
inputs:
pathtoPublish: $(Build.ArtifactStagingDirectory)
artifactName: dummy-$(Build.BuildId)
在下面的代码中,我必须禁用CI和PR触发器才能运行depends管道(代码如下)。否则,当我提交到这个仓库时,会触发CI触发器,然后在source管道执行结束之前会被触发。我的代码前两行实现了这一点。接下来,我想让名为source的管道(这是下面YAML中的source属性)在名为Pipelining的项目中(YAML中的project属性)更新master分支时触发当前(depends)管道。
trigger: none
pr: none
resources:
pipelines:
- pipeline: source
project: Pipelining
source: source
trigger:
branches:
include:
- master
steps:
- checkout: none
- script: echo 'triggered depends'
是否合理?在Azure DevOps中,您的项目名称与YAML“depends”管道代码中的property
匹配非常重要。对我来说,它是Pipelining
。
![enter image description here](https://istack.dev59.com/U9DHT.webp)
以及YAML“depends”管道代码中的source
属性。
![enter image description here](https://istack.dev59.com/x9czU.webp)
更改default
分支
为了更改defaultBranch
,因为上面提到的问题,您应该编辑管道(在本例中是depends
管道),然后在右上角的三个点中选择Triggers
。然后选择YAML
选项卡,您将进入下面图片所示的屏幕,在那里您可以设置工作分支。
![enter image description here](https://istack.dev59.com/tWeta.webp)