【发布时间】:2021-01-02 08:36:07
【问题描述】:
在 Azure DevOps(YAML 管道)中,我们有一个阶段,只有在另一组阶段被跳过后才应该运行。
在下面的示例中,参数copyStages_UAT可以在触发手动运行时由用户修改,这意味着不可能硬编码dependsOn和condition属性,因此需要使用指令@987654324 @。
- template: ../Stages/stage--code--depoly-to-environment.yml
parameters:
name: Deploy_PRD_UKS
displayName: Deploy PRD - UK South
dependsOn:
- ${{ each uatStage in parameters.copyStages_UAT }}:
- Roll_Back_${{ uatStage.name }}
variables:
- template: ../Variables/variables--code--global.yml
- template: ../Variables/variables--code--prd.yml
environment: PRD
上面的这个阶段在管道中工作,但是因为成功运行会导致在dependsOn 中定义的阶段被跳过,遗憾的是,Azure DevOps 也会跳过这个阶段。
为了解决这个问题,我尝试添加condition 来检查之前的阶段是否都被跳过了。
condition: >-
and(replace(
${{ each uatStage in parameters.copyStages_UAT }}:
eq(dependencies.Roll_Back_${{ uatStage.name }}.result, 'Skipped'),
), ', )', ' )')
不幸的是,我似乎无法在这种情况下使用指令each -
在此上下文中不允许使用指令“每个”。嵌入在字符串中的表达式不支持指令。仅当整个值是表达式时才支持指令。
由于condition 只能是字符串,我如何利用表达式和/或指令来构造我想要的条件?
所需 YAML 示例
假设为参数copyStages_UAT 给出了以下值-
- name: UAT_UKS
displayName: UAT - UK South
- name: UAT_UKW
displayName: UAT - UK West
这就是 YAML 的编译方式。我不担心条件的格式,只要包括相关检查即可。
- template: ../Stages/stage--code--depoly-to-environment.yml
parameters:
name: Deploy_PRD_UKS
displayName: Deploy PRD - UK South
dependsOn:
- Roll_Back_UAT_UKS
- Roll_Back_UAT_UKW
condition: >-
and(
eq(dependencies.Roll_Back_UAT_UKS.result, 'Skipped'),
eq(dependencies.Roll_Back_UAT_UKW.result, 'Skipped')
)
variables:
- template: ../Variables/variables--code--global.yml
- template: ../Variables/variables--code--prd.yml
environment: PRD
【问题讨论】:
标签: azure-devops yaml azure-pipelines