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

Azure DevOps Pipeline阶段条件配置及手动取消问题求助

Azure DevOps Pipeline 阶段触发条件配置方案

核心思路

使用运行时表达式($[])判断手动传入的变量,同时结合Pipeline状态函数(succeeded()、canceled()、succeededOrFailed()),既满足触发规则,又支持手动取消操作。

完整YAML配置示例

stages:
- stage: Step1
  displayName: '阶段1'
  condition: $[and(succeeded(), not(or(variables['PROD'], variables['SWINT'])))]
  jobs:
  - job: Job1
    steps:
    - script: echo "运行阶段1"

- stage: Step2
  displayName: '阶段2'
  condition: $[and(succeeded(), not(or(variables['PROD'], variables['UNIT'])))]
  jobs:
  - job: Job2
    steps:
    - script: echo "运行阶段2"

- stage: Step3
  displayName: '阶段3'
  condition: $[and(not(canceled()), succeededOrFailed())]
  jobs:
  - job: Job3
    steps:
    - script: echo "运行阶段3"

各阶段条件说明

阶段1(Step1)

  • 触发规则:默认运行,仅当手动构建时传入PROD或SWINT变量时跳过
  • 条件逻辑:
    • succeeded():继承默认行为,确保前置阶段(首个阶段无依赖,即初始状态为成功)正常才运行
    • not(or(variables['PROD'], variables['SWINT'])):判断是否未传入PROD或SWINT变量
    • 组合后:仅当构建未被取消、前置状态正常,且未传入指定变量时,运行阶段1

阶段2(Step2)

  • 触发规则:默认运行,仅当手动构建时传入PROD或UNIT变量时跳过
  • 条件逻辑:
    • 与阶段1逻辑一致,仅替换判断变量为PROD和UNIT
    • 当手动传入SWINT时,阶段1被跳过,但succeeded()仍为true(跳过的阶段不算失败),因此阶段2会正常运行,符合需求

阶段3(Step3)

  • 触发规则:始终触发(无论前置阶段成功/失败/跳过),但支持手动取消
  • 条件逻辑:
    • not(canceled()):如果构建被手动取消,该阶段停止运行
    • succeededOrFailed():等价于or(succeeded(), failed()),确保无论前置阶段状态如何,只要未被取消就运行
    • 组合后:只要构建未被取消,不管前置阶段状态,都会运行阶段3

解决的核心问题

  1. 手动取消支持:所有阶段条件包含状态判断,手动取消时canceled()为true,阶段不会强制运行
  2. 变量判断生效:使用运行时表达式$[]而非编译时表达式${{}},能正确识别手动构建传入的变量
  3. 阶段依赖与跳过逻辑:阶段1/2基于succeeded()判断,跳过的阶段不影响后续阶段状态,确保阶段3正常触发

注意事项

  • 手动传入变量时,只需在构建触发界面添加变量名(无需赋值,只要存在即可触发跳过逻辑)
  • 若需判断变量具体值,可调整表达式,例如eq(variables['PROD'], 'true')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:42:49