Jenkins pipeline中WHEN语句使用规则与常见问题咨询
问题解答
1. WHEN表达式的写法规则
when块里的expression支持两种合法写法,效果完全等效:
- 直接写布尔表达式即可,比如
params.ENV == 'prod',Groovy会自动将块内最后一行的执行结果作为返回值 - 也可以显式加
return语句写为return params.ENV == 'prod';,没有强制要求必须显式声明返回值,只要块内最终输出布尔值就可以正常运行。
2. WHEN的执行时机&参数读取规则
默认情况下when是在stage进入后、steps执行前运行的。
如果params.MY_PARAMETER_FROM_INPUT是流水线全局参数(包括在之前stage的input步骤生成、存入params的参数),when都可以正常读取到值;但如果是当前stage里定义的input参数,那when运行时input还没执行,无法读取到对应值。
3. 是否可以切换WHEN的执行时机
可以调整when的运行顺序,但仅支持调整为更早执行,无法切换到流水线声明期(声明期是流水线加载解析的阶段,还未进入运行流程,所有动态参数都未加载,无法做条件判断)。
Jenkins提供两个配置项调整执行时机:
- 加
beforeAgent true:when会在拉取当前stage的agent节点之前执行,避免条件不满足时浪费资源拉取节点 - 加
beforeInput true:when会在当前stage的input步骤执行之前运行
4. 条件满足才弹input的实现方式
直接给when加beforeInput true配置即可实现需求,配置后执行顺序变为:stage触发 → 执行when判断 → 条件满足才弹出input确认框,条件不满足直接跳过整个stage。
5. WHEN和script中IF的区别&WHEN的可用位置
- 适用场景区别:
when是声明式流水线的专属语法,仅用来控制整个stage是否执行,写法简洁符合声明式语法规范,适合做stage级别的执行控制- script块里的
if是Groovy原生语法,灵活度更高,可以用来控制steps内部的某几行代码是否执行,适合做stage内部更细粒度的逻辑控制
- WHEN的可用位置:只能在
stage块下定义,不能在steps、script、pipeline块内直接使用,pipeline全局的执行控制可以用顶层的parameters、triggers等配置实现。
代码问题原因
你的代码没有给when加beforeInput true配置,走的是默认执行顺序:先执行input弹出确认框,用户确认后才执行when的条件判断,所以不管ENV参数是什么都会先弹框。
修改后的正确写法如下:
when { beforeInput true expression { params.ENV == 'prod' } } input { message "Really?" ok "Yeah!" }
改完后只有当params.ENV等于prod时才会弹出确认框,否则直接跳过整个stage。
内容的提问来源于stack exchange,提问作者aleksanderacai
相关产品推荐
相关产品推荐

