我的 YAML 发布管道有 100 多个阶段,重要的阶段名称以“Start_Deployment_****”开头。
我最后有一个阶段,应该在上述所有阶段完成后运行。我知道我可以在第 100 个阶段的 DependsOn 属性下提供所有 99 个阶段名称,但我认为这不是一个好的解决方案。
有什么方法可以循环某些预定义变量来获取以上述字符串开头的阶段名称,并在第 100 个阶段的 DependsOn 属性下使用它们? (因为阶段名称的值在编译时可用)
stages:
- stage: Start_Deployment_1
jobs:
- job:
steps:
- script: **
- stage: Start_Deployment_2
jobs:
- job:
steps:
- script: **
- stage: Start_Deployment_3
jobs:
- job:
steps:
- script: **
.....
.....
.....
- stage: Start_Deployment_99
jobs:
- job:
steps:
- script: **
.....
- stage: DeployToPRod_100
dependsOn:
- // get all above 99 stage names here, maybe using foreach on some predefined variable..
-
jobs:
- job:
steps:
- script: **
当您在管道中定义多个阶段时,默认情况下,它们按照您在 YAML 文件中定义的顺序依次运行。例外情况是当您添加依赖项时。有了依赖关系,阶段就按照
dependsOn
要求的顺序运行。
如果在 PROD 之前运行的阶段是以编程方式生成的(例如使用
${{ each ... }}
关键字),则可以轻松地将依赖项添加到最终阶段。
示例:
parameters:
- name: environments
type: object
default:
- name: Stage1
displayName: "Stage 1"
- name: Stage2
displayName: "Stage 2"
- name: Stage3
displayName: "Stage 3"
trigger: none
pool:
vmImage: 'ubuntu-latest'
stages:
- ${{ each environment in parameters.environments }}:
- stage: ${{ environment.name }}
displayName: ${{ environment.displayName }}
dependsOn: [] # run in parallel
jobs:
- job: Job1
displayName: "Job 1"
steps:
- script: echo "This is ${{ environment.displayName }}, Job 1"
displayName: "Print Message"
- stage: DeployProd
displayName: "Deploy Prod"
dependsOn:
- ${{ each environment in parameters.environments }}:
- ${{ environment.name }}
jobs:
- job: Job3
displayName: "Job 3"
steps:
- script: echo "This is Prod Stage"
displayName: "Print Message"
结果:
恐怕没有现成的预定义变量可以直接获取之前所有阶段的名称,然后在最后阶段的dependsOn字段中循环它。
另外,由于dependsOn字段需要在编译时扩展,所以我们不能使用脚本来设置自定义变量。
我最后有一个阶段,应该在上述所有阶段完成后运行。
作为解决方法,我建议您可以将管道分成两部分。
管道一用于运行所有 99 个阶段,管道二用于运行最后阶段。同时,您可以在管道二中添加管道资源,并设置管道完成触发器。
例如:
管道一:
stages:
- stage: Start_Deployment_1
jobs:
- job:
steps:
- script: **
- stage: Start_Deployment_2
jobs:
- job:
steps:
- script: **
- stage: Start_Deployment_3
jobs:
- job:
steps:
- script: **
.....
.....
.....
- stage: Start_Deployment_99
jobs:
- job:
steps:
- script: **
.....
管道二:
resources:
pipelines:
- pipeline: PipelineOne
project: DevOpsProject
source: PipelineOne-CI
trigger: true
stages:
- stage: DeployToPRod_100
jobs:
- job:
steps:
- script: **
在这种情况下,当管道一完成(所有 99 个阶段完成)时,它将触发管道二运行最后一个阶段。您不需要在 Final 阶段设置 DependsOn。
更多详细信息,您可以参考以下文档:定义管道资源和resources.pipelines.pipeline.trigger定义