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

Azure DevOps Pipeline分阶段运行时用户输入交互需求

实现逐阶段确认的Azure DevOps Pipeline

要实现每个阶段前触发用户选择(而非提前展示所有选项),可以通过前置确认阶段+手动干预任务+阶段条件判断的方案达成,具体逻辑如下:

  • 为每个业务阶段配套一个前置确认阶段,仅用于触发用户选择
  • 确认阶段按顺序依赖,保证逐阶段触发用户确认
  • 业务阶段根据前置确认的用户选择结果,决定是否执行

完整YAML示例

trigger: none

variables:
  # 初始化变量,默认跳过所有阶段
  runStage1: 'false'
  runStage2: 'false'
  runStage3: 'false'
  runStage4: 'false'
  runStage5: 'false'

stages:
  # 确认阶段1:询问是否执行阶段1
  - stage: ConfirmStage1
    displayName: '确认是否执行阶段1'
    jobs:
      - job: ConfirmJob1
        displayName: '确认任务1'
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - task: ManualIntervention@8
            displayName: '选择是否执行阶段1'
            inputs:
              instructions: '请选择是否执行阶段1?'
              choices: |
                继续
                跳过
              onTimeout: 'reject'
            name: Stage1Decision
            condition: always()
            continueOnError: true
          - script: |
              echo "##vso[task.setvariable variable=runStage1;isOutput=true]$(Stage1Decision.choice)"
            displayName: '设置阶段1执行变量'
            condition: always()
            name: SetStage1Var

  # 业务阶段1
  - stage: Stage1
    displayName: '业务阶段1'
    dependsOn: ConfirmStage1
    condition: eq(dependencies.ConfirmStage1.outputs['ConfirmJob1.SetStage1Var.runStage1'], '继续')
    jobs:
      - job: Stage1Job
        displayName: '阶段1任务'
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - script: echo "执行业务阶段1的任务"
            displayName: '运行阶段1逻辑'

  # 确认阶段2:询问是否执行阶段2
  - stage: ConfirmStage2
    displayName: '确认是否执行阶段2'
    dependsOn: Stage1
    # 无论阶段1是否执行,都触发确认阶段2
    condition: always()
    jobs:
      - job: ConfirmJob2
        displayName: '确认任务2'
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - task: ManualIntervention@8
            displayName: '选择是否执行阶段2?'
            inputs:
              instructions: '请选择是否执行阶段2?'
              choices: |
                继续
                跳过
              onTimeout: 'reject'
            name: Stage2Decision
            condition: always()
            continueOnError: true
          - script: |
              echo "##vso[task.setvariable variable=runStage2;isOutput=true]$(Stage2Decision.choice)"
            displayName: '设置阶段2执行变量'
            condition: always()
            name: SetStage2Var

  # 业务阶段2
  - stage: Stage2
    displayName: '业务阶段2'
    dependsOn: ConfirmStage2
    condition: eq(dependencies.ConfirmStage2.outputs['ConfirmJob2.SetStage2Var.runStage2'], '继续')
    jobs:
      - job: Stage2Job
        displayName: '阶段2任务'
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - script: echo "执行业务阶段2的任务"
            displayName: '运行阶段2逻辑'

  # 确认阶段3
  - stage: ConfirmStage3
    displayName: '确认是否执行阶段3'
    dependsOn: Stage2
    condition: always()
    jobs:
      - job: ConfirmJob3
        displayName: '确认任务3'
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - task: ManualIntervention@8
            displayName: '选择是否执行阶段3?'
            inputs:
              instructions: '请选择是否执行阶段3?'
              choices: |
                继续
                跳过
              onTimeout: 'reject'
            name: Stage3Decision
            condition: always()
            continueOnError: true
          - script: |
              echo "##vso[task.setvariable variable=runStage3;isOutput=true]$(Stage3Decision.choice)"
            displayName: '设置阶段3执行变量'
            condition: always()
            name: SetStage3Var

  # 业务阶段3
  - stage: Stage3
    displayName: '业务阶段3'
    dependsOn: ConfirmStage3
    condition: eq(dependencies.ConfirmStage3.outputs['ConfirmJob3.SetStage3Var.runStage3'], '继续')
    jobs:
      - job: Stage3Job
        displayName: '阶段3任务'
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - script: echo "执行业务阶段3的任务"
            displayName: '运行阶段3逻辑'

  # 确认阶段4
  - stage: ConfirmStage4
    displayName: '确认是否执行阶段4'
    dependsOn: Stage3
    condition: always()
    jobs:
      - job: ConfirmJob4
        displayName: '确认任务4'
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - task: ManualIntervention@8
            displayName: '选择是否执行阶段4?'
            inputs:
              instructions: '请选择是否执行阶段4?'
              choices: |
                继续
                跳过
              onTimeout: 'reject'
            name: Stage4Decision
            condition: always()
            continueOnError: true
          - script: |
              echo "##vso[task.setvariable variable=runStage4;isOutput=true]$(Stage4Decision.choice)"
            displayName: '设置阶段4执行变量'
            condition: always()
            name: SetStage4Var

  # 业务阶段4
  - stage: Stage4
    displayName: '业务阶段4'
    dependsOn: ConfirmStage4
    condition: eq(dependencies.ConfirmStage4.outputs['ConfirmJob4.SetStage4Var.runStage4'], '继续')
    jobs:
      - job: Stage4Job
        displayName: '阶段4任务'
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - script: echo "执行业务阶段4的任务"
            displayName: '运行阶段4逻辑'

  # 确认阶段5
  - stage: ConfirmStage5
    displayName: '确认是否执行阶段5'
    dependsOn: Stage4
    condition: always()
    jobs:
      - job: ConfirmJob5
        displayName: '确认任务5'
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - task: ManualIntervention@8
            displayName: '选择是否执行阶段5?'
            inputs:
              instructions: '请选择是否执行阶段5?'
              choices: |
                继续
                跳过
              onTimeout: 'reject'
            name: Stage5Decision
            condition: always()
            continueOnError: true
          - script: |
              echo "##vso[task.setvariable variable=runStage5;isOutput=true]$(Stage5Decision.choice)"
            displayName: '设置阶段5执行变量'
            condition: always()
            name: SetStage5Var

  # 业务阶段5
  - stage: Stage5
    displayName: '业务阶段5'
    dependsOn: ConfirmStage5
    condition: eq(dependencies.ConfirmStage5.outputs['ConfirmJob5.SetStage5Var.runStage5'], '继续')
    jobs:
      - job: Stage5Job
        displayName: '阶段5任务'
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - script: echo "执行业务阶段5的任务"
            displayName: '运行阶段5逻辑'

关键逻辑说明

  • 确认阶段:每个ConfirmStageX阶段仅包含ManualIntervention@8任务,该任务会暂停管道,等待用户选择“继续”或“跳过”,并通过##vso[task.setvariable]将选择结果设为跨阶段输出变量。
  • 阶段依赖与条件:
    • 确认阶段依赖前一个业务阶段,且设置condition: always(),确保无论前一个业务阶段是否执行,都会触发当前确认流程。
    • 业务阶段通过condition判断前置确认阶段的输出变量是否为“继续”,只有符合条件才会执行。
  • 变量传递:通过dependencies.阶段名.outputs['任务名.设置变量任务名.变量名']的语法,跨阶段获取用户的选择结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:50:08