AzureDevops stage dependsOn stageDependencies
AzureDevops stage dependsOn stageDependencies
如何根据从参数派生的 stage/job-name 创建多阶段管道,而阶段 运行 首先是并行的,最后一个阶段等待所有前面的阶段?
这是我目前尝试过的方法:
多级流水线 运行s 用于多个阶段,具体取决于并行的工具参数,而 dependsOn
作为参数传递。 运行 它并行地等待每个工具的前一阶段,以便所述工具顺利工作。
主模板:一切待命
- ${{ each tool in parameters.Tools }}:
- template: ../stages/all-wait-for-all.yml
parameters:
Tool: ${{ tool }}
stages/all-wait-for-all.yml
parameters:
- name: Tool
type: string
stages:
- stage: ALL_WAIT_${{ parameters.Tool}}
dependsOn:
- PREPARE_STAGE
- OTHER_TEMPLATE_EXECUTED_FOR_ALL_TOOLS_${{ parameters.Tool }}
现在应该有一个阶段应该只 运行 一次而不是每个工具,但它应该只 运行 在各个工具阶段完成之后。它不能硬编码,因为有各种工具。所以我希望在准备工作中定义各个等待阶段会成功:
主模板:prepare-stage
- script: |
toolJson=$(echo '${{ convertToJson(parameters.Tools) }}')
tools=$(echo "$toolJson" | jq '.[]' | xargs)
stage="ALL_WAIT"
for tool in $tools; do
stageName="${stage}_${tool }"
stageWaitArray+=($stageName)
done
echo "##vso[task.setvariable variable=WAIT_ON_STAGES]${stageWaitArray}"
echo "##vso[task.setvariable variable=WAIT_ON_STAGES;isOutput=true]${stageWaitArray}"
displayName: "Define wait stages"
name: WaitStage
stages/one-waits-for-all.yml
stages:
- stage: ONE_WAITS
dependsOn:
- $[ stageDependencies.PREPARE_STAGE.PREPARE_JOB.outputs['waitStage.WAIT_ON_STAGES'] ]
而显示以下错误:
Stage ONE_WAITS depends on unknown stage $[ stageDependencies.PREPARE_STAGE.PREPARE_JOB.outputs['WaitStage.WAIT_ON_STAGES'] ].
据我了解,依赖于不能在运行时评估动态 $[] 或宏 $() 表达式。您可以使用在排队时计算的模板表达式 ${{}}。
我猜我想得太多了,因为最终它很明显。
所以第一个模板可以在主模板的循环中调用,而它的执行次数与我们获得的工具一样多。一旦等待所有工具的先前阶段,应调用第二个模板,而 job/stage 前缀是已知的,只有作为后缀的工具名称是未知的。所以只需将它们直接添加到循环中 dependsOn
..
给你:
stages:
- stage: ONE_WAITS
dependsOn:
- PREPARE_STAGE
- ${{ each tool in parameters.Tools }}:
- OTHER_TEMPLATE_EXECUTED_FOR_ALL_TOOLS_${{ tool}}
- ALL_WAIT_${{ tool }}
如何根据从参数派生的 stage/job-name 创建多阶段管道,而阶段 运行 首先是并行的,最后一个阶段等待所有前面的阶段?
这是我目前尝试过的方法:
多级流水线 运行s 用于多个阶段,具体取决于并行的工具参数,而 dependsOn
作为参数传递。 运行 它并行地等待每个工具的前一阶段,以便所述工具顺利工作。
主模板:一切待命
- ${{ each tool in parameters.Tools }}:
- template: ../stages/all-wait-for-all.yml
parameters:
Tool: ${{ tool }}
stages/all-wait-for-all.yml
parameters:
- name: Tool
type: string
stages:
- stage: ALL_WAIT_${{ parameters.Tool}}
dependsOn:
- PREPARE_STAGE
- OTHER_TEMPLATE_EXECUTED_FOR_ALL_TOOLS_${{ parameters.Tool }}
现在应该有一个阶段应该只 运行 一次而不是每个工具,但它应该只 运行 在各个工具阶段完成之后。它不能硬编码,因为有各种工具。所以我希望在准备工作中定义各个等待阶段会成功:
主模板:prepare-stage
- script: |
toolJson=$(echo '${{ convertToJson(parameters.Tools) }}')
tools=$(echo "$toolJson" | jq '.[]' | xargs)
stage="ALL_WAIT"
for tool in $tools; do
stageName="${stage}_${tool }"
stageWaitArray+=($stageName)
done
echo "##vso[task.setvariable variable=WAIT_ON_STAGES]${stageWaitArray}"
echo "##vso[task.setvariable variable=WAIT_ON_STAGES;isOutput=true]${stageWaitArray}"
displayName: "Define wait stages"
name: WaitStage
stages/one-waits-for-all.yml
stages:
- stage: ONE_WAITS
dependsOn:
- $[ stageDependencies.PREPARE_STAGE.PREPARE_JOB.outputs['waitStage.WAIT_ON_STAGES'] ]
而显示以下错误:
Stage ONE_WAITS depends on unknown stage $[ stageDependencies.PREPARE_STAGE.PREPARE_JOB.outputs['WaitStage.WAIT_ON_STAGES'] ].
据我了解,依赖于不能在运行时评估动态 $[] 或宏 $() 表达式。您可以使用在排队时计算的模板表达式 ${{}}。
我猜我想得太多了,因为最终它很明显。
所以第一个模板可以在主模板的循环中调用,而它的执行次数与我们获得的工具一样多。一旦等待所有工具的先前阶段,应调用第二个模板,而 job/stage 前缀是已知的,只有作为后缀的工具名称是未知的。所以只需将它们直接添加到循环中 dependsOn
..
给你:
stages:
- stage: ONE_WAITS
dependsOn:
- PREPARE_STAGE
- ${{ each tool in parameters.Tools }}:
- OTHER_TEMPLATE_EXECUTED_FOR_ALL_TOOLS_${{ tool}}
- ALL_WAIT_${{ tool }}