问题描述
在Azure DevOps中有两个YAML流水线,分别称为B(应用程序构建)和D(应用程序部署)。D会在Dev、QA和Test环境中的各个阶段部署。在DevOps中,QA和Test环境配置为在D的各个阶段执行之前需要批准。B和D的YAML文件位于同一个DevOps项目中。
代码仓库是Azure DevOps Git。B由完成合并到main
分支的操作触发。D由B成功完成触发。如果有必要,我已经通过配置D在B成功完成后触发来实现。
现在,我希望B不仅可以由将特性推送到main
分支触发,还可以由将修补程序推送到任何名为release/*
的分支触发。因此,我将B的触发器配置更改为:
trigger:
- main
- release/*
区别在于,修补程序只应部署到Test环境,而不是Dev或QA环境。
因此,在D中,我希望将Dev和QA部署阶段的执行条件设置为B的触发分支为main
。在D中是否有一种方法可以从B中访问$(Build.SourceBranch)
的值?
更新:我现在了解到,我上面描述的D由B触发的方式已经过时,我应该使用类似于以下的方式:
resources:
pipelines:
- pipeline: sourcePipeline
source: 'B'
trigger:
branches:
- main
- release/*
这是正确的设置方式吗?我需要在这里指定分支吗?(我看到一个示例只有trigger: true
,我猜这意味着第二个流水线应该始终在第一个完成后运行。也许只有当B可能由许多分支触发,但D只应在B由其中的一个子集触发时运行时,才需要在上面指定分支。)
如果这是首选的方法,并且我切换到它,那么我现在可以通过$(resources.pipeline.sourcePipeline.SourceBranch)
在D中访问B的触发分支了吗?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在Azure DevOps中,可以通过使用resources
关键字来访问B流水线的触发分支。以下是设置的步骤:
- 打开D流水线的YAML文件。
- 在文件中添加以下代码:
resources:
pipelines:
- pipeline: sourcePipeline
source: 'B'
trigger: true
在上面的代码中,我们使用resources
关键字定义了一个名为sourcePipeline
的流水线资源,它的源是B流水线。通过设置trigger
为true
,我们确保D流水线在B流水线成功完成后触发。
- 现在,你可以在D流水线中使用
$(resources.pipeline.sourcePipeline.SourceBranch)
来访问B流水线的触发分支。
方案2
使用脚本或工具来管理流水线的触发顺序可能会增加复杂性,并且需要确保B和D之间的依赖关系正确设置。
另一种方法是使用脚本或工具来控制流水线的运行顺序。你可以使用Azure DevOps提供的API来获取B流水线的触发分支,并在D流水线中使用该信息来设置条件。
以下是一个示例脚本,可以获取B流水线的触发分支:
# 使用Azure DevOps API获取B流水线的触发分支
source_branch=$(curl -s -H "Authorization: Bearer $(System.AccessToken)" "https://dev.azure.com/{organization}/{project}/_apis/build/builds/$(Build.BuildId)?api-version=6.0" | jq -r '.triggerInfo.sourceBranch')
# 将触发分支传递给D流水线
echo "##vso[task.setvariable variable=source_branch;isOutput=true]$source_branch"
在上面的示例中,我们使用Azure DevOps的API来获取B流水线的触发分支,并将其存储在一个变量中。然后,我们使用echo
命令将该变量传递给D流水线。
请注意,这种方法需要在D流水线中使用自定义脚本任务来执行上述脚本,并将触发分支传递给D流水线的其他任务。
方案3
请注意以下操作注意版本差异及修改前做好备份。
如果你使用的是较新版本的Azure DevOps,你可以使用resources
关键字的trigger
属性来设置B流水线的触发分支,并在D流水线中使用dependencies
关键字来设置D流水线依赖于B流水线。
以下是设置的步骤:
- 打开D流水线的YAML文件。
- 在文件中添加以下代码:
resources:
pipelines:
- pipeline: sourcePipeline
source: 'B'
trigger:
branches:
- main
- release/*
dependencies:
- pipeline: sourcePipeline
source: 'B'
在上面的代码中,我们使用resources
关键字定义了一个名为sourcePipeline
的流水线资源,它的源是B流水线。通过设置trigger
属性来指定B流水线的触发分支。
然后,我们使用dependencies
关键字来设置D流水线依赖于B流水线。这将确保D流水线在B流水线成功完成后触发。
- 现在,你可以在D流水线中使用
$(resources.pipeline.sourcePipeline.SourceBranch)
来访问B流水线的触发分支。
请注意,这种方法需要在D流水线中使用较新版本的Azure DevOps才能正常工作。
以上是几种在Azure DevOps中获取B流水线的触发分支的方法。你可以根据你的需求选择适合你的方法。