Azure DevOps中如何获取触发流水线的触发分支

85次阅读
没有评论

问题描述

在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流水线的触发分支。以下是设置的步骤:

  1. 打开D流水线的YAML文件。
  2. 在文件中添加以下代码:
resources:
  pipelines:
    - pipeline: sourcePipeline
      source: 'B'
      trigger: true

在上面的代码中,我们使用resources关键字定义了一个名为sourcePipeline的流水线资源,它的源是B流水线。通过设置triggertrue,我们确保D流水线在B流水线成功完成后触发。

  1. 现在,你可以在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流水线。

以下是设置的步骤:

  1. 打开D流水线的YAML文件。
  2. 在文件中添加以下代码:
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流水线成功完成后触发。

  1. 现在,你可以在D流水线中使用$(resources.pipeline.sourcePipeline.SourceBranch)来访问B流水线的触发分支。

请注意,这种方法需要在D流水线中使用较新版本的Azure DevOps才能正常工作。

以上是几种在Azure DevOps中获取B流水线的触发分支的方法。你可以根据你的需求选择适合你的方法。

正文完