Jenkins declarative pipeline如何在条件不满足时中止构建而非跳过阶段
问题原因
Jenkins Declarative Pipeline的语法规范中,when指令仅允许定义在单个stage块内部,不支持直接放在stages顶层或者pipeline根节点下,因此你之前的写法会触发Expected stage、Undefined section when类的语法错误。
实现方案
可根据你的实际需求选择以下两种方案:
方案1:参数校验不通过直接中止构建(构建结果标记为失败)
新增一个优先级最高的前置校验阶段,匹配到条件后调用error指令直接终止整个流水线,后续所有阶段都不会执行,代码示例如下:
pipeline { agent any parameters { booleanParam(name: 'boolean_parameter', defaultValue: false, description: '测试布尔参数') stringParam(name: 'string_parameter', defaultValue: '', description: '测试字符串参数') } stages { stage('前置参数校验') { when { anyOf { not { equals expected: true, actual: params.boolean_parameter } not{ equals expected: '', actual: params.string_parameter } } } steps { error "参数校验不通过,中止构建:布尔参数不为true 或 字符串参数不为空" } } // 下方为你原有业务阶段 stage('业务阶段1') { steps { echo '执行业务逻辑1' } } stage('业务阶段2') { steps { echo '执行业务逻辑2' } } } }
当你定义的条件命中时,校验阶段会直接抛出错误中止构建,完全符合「条件不满足提前中止整个构建」的需求。
方案2:仅跳过所有业务阶段,构建结果仍标记为成功
如果不需要标记构建失败,只是不执行后续所有业务逻辑,可以将所有业务阶段嵌套在同一个父stage下,给父stage加上反向的when条件即可:
pipeline { agent any parameters { booleanParam(name: 'boolean_parameter', defaultValue: false, description: '测试布尔参数') stringParam(name: 'string_parameter', defaultValue: '', description: '测试字符串参数') } stages { stage('所有业务逻辑') { when { // 此处为执行业务逻辑的生效条件,和你原有的判断逻辑反向 allOf { equals expected: true, actual: params.boolean_parameter equals expected: '', actual: params.string_parameter } } stages { stage('业务阶段1') { steps { echo '执行业务逻辑1' } } stage('业务阶段2') { steps { echo '执行业务逻辑2' } } } } } }
这种写法当条件不满足时,父stage下的所有子stage都会被跳过,整个构建最终状态为成功。
内容的提问来源于stack exchange,提问作者user10916892
相关产品推荐
相关产品推荐

