【发布时间】:2020-04-22 06:50:13
【问题描述】:
要求
因此,Azure DevOps 中有一些新功能允许管道触发其他管道,并在此处记录:https://docs.microsoft.com/en-us/azure/devops/pipelines/build/triggers?view=azure-devops&tabs=yaml#pipeline-triggers-1 听起来不错,但我无法获得所需的行为。我想在同一个存储库中有 2 个管道:
- 流水线 A:仅由其自身 repo 之外的多个其他流水线触发,但在同一个项目中。由于被触发,它会更改自己的 repo,从而触发管道 B。
- 管道 B:仅由对其自己的存储库的更改触发,并且在触发时继续执行它需要做的任何事情
流水线 A 语法
resources:
pipelines:
- pipeline: database
source: database
trigger:
branches:
- develop
- release/*
# The stages filter should work, according to: https://docs.microsoft.com/en-us/azure/devops/pipelines/build/triggers?view=azure-devops&tabs=yaml
# However, this error occurs when specifying: /azure-pipelines.yml (Line: 8, Col: 15): Stage filters in pipeline resource database is not supported.
#stages:
#- Build
- pipeline: auth
source: auth
trigger:
branches:
- develop
- release/*
- pipeline: api
source: api
trigger:
branches:
- develop
- release/*
- pipeline: web
source: web
trigger:
branches:
- develop
- release/*
... multiple triggers - 9 in total
stages:
...
当前行为
管道 A 不会由任何其他管道触发,而只会在其自己的存储库发生更改时触发。由于它无论如何都会对自己的 repo 进行更改,因此它会在无限循环中触发自己。
问题/意见
- 管道 A 的语法是否正确?
- 来自文档:“但是,如果两个管道使用不同的存储库,则触发的管道将使用其默认分支中最新版本的代码。”我假设这意味着来自默认分支的 yaml 管道将被激活。我们真的有那么一点点控制权吗?在管道声明中指定目标分支会更好。
- 是否有可能以某种方式获取触发管道的源分支?
- 为什么阶段过滤器不按文档说明工作?
- 在管道 A 中,为了停止循环,我尝试使用 $(Build.TriggeredBy.DefinitionId) 检查它是否与 $(System.DefinitionId) 相同,如果是则跳过构建步骤,但 $(Build. TriggeredBy.DefinitionId) 没有值
- 如果我不能让它工作,我倾向于让其他管道触发管道 A。
发现
- 将
trigger: none添加到管道 A 的顶部会阻止它在对其存储库进行提交时运行,它目前根本不运行! - 在单独帐户中的简化管道场景中,我设法使触发的构建工作,在同一个 repo 中有 2 个管道,并发现:
- 执行的 yaml 管道文件与触发管道上的提交位于同一分支
- 检出的代码也来自与触发管道上的提交相同的分支
- 从 GUI 手动执行管道不会触发相关管道
- 从属管道在第一次启动时立即被触发并排队
- 我无法让分支排除工作:无论排除条款如何,都会触发管道
- 在单独的帐户中运行简化的管道场景,在仓库 C 中使用管道 A,在仓库 D 中使用依赖管道 B(同一项目),我无法让管道 A 触发管道 B,所以远(我原来的场景)
- 非常高兴 :-) 有一个 azure devops 命令行扩展,它获得了管道支持并允许您触发管道:
- 安装:https://docs.microsoft.com/en-us/azure/devops/cli/?view=azure-devops
- 管道运行文档:https://docs.microsoft.com/en-us/cli/azure/ext/azure-devops/pipelines?view=azure-cli-latest#ext-azure-devops-az-pipelines-run
- 流水线触发命令示例:
az pipelines run --branch master --name "<PipelineName>" --org "https://dev.azure.com/<OrganisationName>" -p "<ProjectName>" - Azure DevOps 集成示例:https://docs.microsoft.com/en-us/azure/devops/cli/azure-devops-cli-in-yaml?view=azure-devops
【问题讨论】:
-
6 个问题合二为一,哇。我看不出你的语法有什么问题。管道名称错误?不知道
-
@vipes 感谢分享。我正在为类似的事情苦苦挣扎。你做了什么: - 当其他管道完成时只运行管道 A 一次?
-
抱歉@wolszakp - 我没有收到您的评论通知。根据我在下面的回答,我创建了一个可重用的 yaml 模板,该模板使用 Azure CLI 触发管道 A,并在处理结束时由许多其他管道调用。一旦管道 A 被触发,它就会更新它所包含的 repo,因为提交而触发管道 B。
标签: azure-devops azure-pipelines build-triggers