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
相关产品推荐
相关产品推荐

