You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure DevOps Pipeline中动态跳过互斥阶段

问题分析

你的流水线中,Stage B和C均依赖Stage A且互斥,但当前配置下,A完成后两个阶段会同时进入等待审批状态。当其中一个阶段(如C)审批执行完成后,另一个阶段(B)仍处于等待状态,无法自动标记为skipped。这是因为Azure DevOps的阶段条件仅在阶段启动前评估一次,一旦阶段进入等待审批状态,后续其他阶段的完成不会重新评估该条件。

解决方案

要实现“其中一个阶段审批完成后,另一个自动标记为skipped”的效果,可通过两种方式调整:

方式一:添加选择阶段(推荐)

通过新增选择阶段让用户明确操作,未被选择的阶段自动跳过,完全符合你的期望效果。

修改后的YAML配置:

stages:
- stage: A
  jobs:
  - job: JobA
    steps:
    - checkout: none    
    - bash: echo "##vso[task.setvariable variable=one;isOutput=true]secondValue"
      name: setOne      
    - bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
      name: MyOutputVar      
- stage: SelectAction
  dependsOn: A
  jobs:
  - job: SelectJob
    pool: server
    steps:
    - task: Input@0
      inputs:
        inputType: 'radio'
        defaultValue: 'deploy'
        label: '选择要执行的操作'
        options: |
          deploy=部署(Stage C)
          rollback=回滚(Stage B)
      name: ActionChoice
- stage: B
  dependsOn: [A, SelectAction]
  condition: eq(stageDependencies.SelectAction.SelectJob.outputs['ActionChoice.input'], 'rollback')
  jobs:
  - deployment: JobB
    environment: 'Integration'
    variables: 
      myvar2: $[stageDependencies.A.JobA.outputs['setOne.one']]
      myStageAVar: $[stageDependencies.A.JobA.outputs['MyOutputVar.myStageVal']]
    strategy: 
      runOnce:
        deploy:
          steps:
          - checkout: none 
          - bash: echo $(myStageAVar)         
          - bash: echo "$(myvar2)"
            displayName: '执行Rollback任务'            
- stage: C
  dependsOn: [A, SelectAction]
  condition: eq(stageDependencies.SelectAction.SelectJob.outputs['ActionChoice.input'], 'deploy')
  jobs:
  - deployment: JobC
    environment: 'Integration'    
    strategy:
      runOnce:
        deploy:
          steps:
          - checkout: none
          - bash: |
              echo "##vso[task.setvariable variable=skipsubsequent;isOutput=true]true"
            name: skipstep   

配置说明

  1. 新增SelectAction阶段:使用Input任务提供单选选项,让用户选择执行部署或回滚操作。
  2. 阶段条件绑定选择结果:Stage B和C的条件判断用户的选择,未被选中的阶段因条件不满足自动标记为skipped。
  3. 保留原有逻辑:Stage A的输出变量传递、部署任务的环境配置等原有逻辑均保留。

方式二:添加环境门(并行审批场景)

若需保留B和C并行等待审批的逻辑,可在阶段中添加环境门,自动检查对方阶段状态,已完成则当前阶段自动跳过。

以Stage B为例的配置修改:

stage: B
dependsOn: A
jobs:
- deployment: JobB
  environment: 
    name: Integration
    gates:
      - job: CheckCStatus
        displayName: 检查Stage C是否已成功
        pool:
          vmImage: ubuntu-latest
        steps:
        - bash: |
            if [ "$(stageDependencies.C.JobC.result)" == "succeeded" ]; then
              echo "Stage C已成功,跳过Stage B"
              exit 1
            else
              echo "Stage C未成功,继续执行Stage B"
              exit 0
            fi
  variables: 
    myvar2: $[stageDependencies.A.JobA.outputs['setOne.one']]
    myStageAVar: $[stageDependencies.A.JobA.outputs['MyOutputVar.myStageVal']]
  strategy: 
    runOnce:
      deploy:
        steps:
        - checkout: none 
        - bash: echo $(myStageAVar)         
        - bash: echo "$(myvar2)"
          displayName: '执行Rollback任务'            

配置说明

在Stage B的部署环境中添加门任务,自动检查Stage C的执行状态:

  • 若C已成功,门任务失败,Stage B自动跳过
  • 若C未执行或执行失败,门任务通过,用户可正常审批执行Stage B

内容的提问来源于stack exchange,提问作者Vincent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:44:54