首页/开发/CI/CD 与发布速查/Jenkins when 条件执行
工具链要点63 条

Jenkins when 条件执行

按分支、变更请求、环境或表达式决定阶段是否执行;配合 beforeAgent / beforeInput 控制条件求值时机,减少无谓节点占用。

CI/CD 与发布速查开发更新于 2026-10-13

when 是干什么的

按分支、变更请求、环境或表达式决定阶段是否执行;配合 beforeAgent 与 beforeInput 控制条件求值时机,减少无谓节点占用与多余等待。条件是组合逻辑:用 not、allOf、anyOf 拼接多个判断。changeRequest 只在多分支流水线里有效,普通流水线用它判断不会命中,要留意生效范围。

基本信息

条件branch、changeRequest、environment、expression
组合not、allOf、anyOf
时机beforeAgent 提前在分配节点前求值
变更过滤changeset 按改动文件匹配
范围changeRequest 只在多分支流水线有效

典型使用场景

  • 分支门禁:仅主分支阶段执行部署
  • 变更请求检查:MR/PR 上跑额外校验
  • 参数门禁:人工参数确认后才发布
  • 改动过滤:按 changeset 只在相关文件变更时跑
  • 排队优化:beforeAgent 提前求值省节点
  • 环境区分:按环境变量分支执行

条件阶段

条件阶段
stage('deploy') {
  when {
    allOf {
      branch 'main'                         # 仅主分支
      expression { params.DEPLOY == true }  # 且参数确认为真
    }
  }
  steps { sh './deploy.sh' }
}

条件读法

条件判断什么注意
branch当前分支匹配配合多分支流水线
changeRequest变更请求仅多分支流水线有效
environment指定环境名与环境变量区分
expression任意布尔表达式参数与变量判断
changeset改动文件匹配匹配范围要写准
beforeAgent 让条件在分配节点前求值:大集群里能省下可观排队时间。
组合逻辑写清楚:allOf 与 anyOf 混用时嵌套分明,避免语义走样。
条件不命中时阶段显示跳过而非失败:按跳过状态排查更准。

维护建议

  • 跳过统计:定期看哪些阶段长期跳过,清理无用逻辑
  • 参数联动:参数变更后下一次运行生效,条件随之重新求值
写否定条件先写肯定含义再取反,复杂判断的可读性更好。
changeset 的匹配范围要写清:范围过宽等于没过滤,过窄会漏跑。
正在运行的构建不受参数变更影响:调整后从下一次运行起生效。
嵌套层级控制:组合条件嵌套两层以上时改写表达式,可读性更好。

回归检查

  • 升级核对:Jenkins 升级后抽样验证 when 行为是否符合预期

易错点

  • 条件本可提前判断却未开 beforeAgent:无谓占用执行器
  • changeRequest 只在多分支流水线有效:普通流水线里判断失效
  • 表达式拼写错误:条件恒不命中,阶段静默跳过不易发现
  • 未开 beforeInput:本可跳过的阶段先弹人工确认,白等一次输入

数据来源与参考

  • Jenkins 手册《Pipeline Syntax》(when)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌