如何配置Azure Pipeline仅在环境审批拒绝时触发后续阶段?
问题
我们可为部署作业定义用于审批的环境。现有一个Azure Pipeline,其中stageA包含一个带环境审批检查的部署作业,以及若干常规作业。我还设置了依赖于stageA的stageB,希望仅当stageA中的部署作业被环境审批检查拒绝时才触发stageB,而stageA中其他常规作业失败时则不触发。相关YAML配置如下:
trigger: - none pool: vmImage: ubuntu-latest stages: - stage: stageA jobs: - deployment: main_job environment: "myenv" strategy: runOnce: deploy: steps: - script: echo "Env_Check pass" displayName: "Env_Check" - job: other_job dependsOn: main_job steps: - script: exit 1; displayName: "failure task" - stage: stageB dependsOn: stageA condition: 'what condition should we put here??' jobs: - job: steps: - script: echo "Env-Check Rejected" displayName: "approval_reject"
请问该如何实现这一需求?
解决方案
要实现仅当stageA中的部署作业main_job因环境审批被拒绝时才触发stageB,需要利用Azure Pipeline的作业状态变量和条件表达式:
核心状态判断逻辑:
- 部署作业被审批拒绝时,其状态会被标记为
Canceled(Azure Pipeline中环境审批拒绝会导致部署作业进入Canceled状态,而非Failed) - 常规作业失败时状态为
Failed,需要排除这种触发场景
- 部署作业被审批拒绝时,其状态会被标记为
stageB的条件配置:
使用以下条件表达式,精准匹配main_job的Canceled状态:
condition: eq(dependencies.stageA.jobs['main_job'].status, 'Canceled')
- 完整修改后的YAML配置:
trigger: - none pool: vmImage: ubuntu-latest stages: - stage: stageA jobs: - deployment: main_job environment: "myenv" strategy: runOnce: deploy: steps: - script: echo "Env_Check pass" displayName: "Env_Check" - job: other_job dependsOn: main_job steps: - script: exit 1; displayName: "failure task" - stage: stageB dependsOn: stageA condition: eq(dependencies.stageA.jobs['main_job'].status, 'Canceled') jobs: - job: steps: - script: echo "Env-Check Rejected" displayName: "approval_reject"
说明:
dependencies.stageA.jobs['main_job'].status直接引用stageA中main_job的运行状态- 只有当环境审批被拒绝导致
main_job进入Canceled状态时,stageB才会触发 - 若因
other_job失败导致stageA整体失败,此时main_job的状态为Succeeded(已正常执行完成),条件不满足,stageB不会触发
内容的提问来源于stack exchange,提问作者ikhvjs
相关产品推荐
相关产品推荐

