Jenkins Pipeline通过分层机制实现复杂条件判断:静态条件用when控制阶段执行,动态逻辑用script块内嵌Groovy处理运行时决策。两者互补——when前置粗筛,script后续细判。

用 when 实现可配置的静态分支
适合基于分支名、环境变量、构建参数、Git 标签或变更文件类型等固定规则做判断。语法简洁、校验严格、日志明确。
-
按分支控制:仅在
main或release/*分支触发部署:when { branch 'main' }或when { branch 'release/**' } -
组合多个前提:必须同时满足才执行,比如“是 main 分支且部署环境为 prod”:
when { allOf { branch 'main'; environment name: 'DEPLOY_ENV', value: 'prod' } } -
跳过特定情况:用
not取反,例如跳过 develop 分支:when { not { branch 'develop' } } -
识别代码变更范围:只在修改了前端文件时运行 UI 测试:
when { changeset "**/*.vue" } -
匹配提交日志关键词:含
[skip-ci]就跳过整个 stage:when { changelog '\[skip-ci\]' }
用 script 处理动态计算与外部交互
当条件依赖运行时数据(如读取文件内容、调用 API、解析 JSON、检查测试覆盖率),就必须进入 `script` 块。它支持完整 Groovy 语法,但需注意位置约束——在声明式 Pipeline 中,`script` 必须写在 `steps` 内部。
-
读文件做判断:检查
pom.xml是否引入某个依赖,决定是否执行集成测试:script { if (readFile('pom.xml').contains('spring-cloud-starter')) { sh 'mvn verify' } } -
调 Git 命令判断上下文:根据 PR 标题是否含
[hotfix]来启用紧急通道:script { if (sh(script: 'git log -1 --oneline | grep -q "\[hotfix\]"', returnStatus: true) == 0) { sh 'make deploy-hotfix' } } -
结合环境变量与数值比较:仅当构建编号大于 100 且当前节点是 Linux 才归档产物:
script { if (currentBuild.number > 100 && env.NODE_NAME.contains('linux')) { sh 'tar -czf artifacts.tgz target/' } }
混合使用:when + script 构建多级判断链
真实场景中常需先用 `when` 过滤掉明显不匹配的构建,再用 `script` 在剩余情况下做深入分析。例如:
- 先用
when { branch 'main' }确保只在主干运行; - 再在该 stage 的
steps中用script读取build-info.json,确认本次构建是否包含安全补丁版本; - 最后根据结果决定是否触发合规扫描或人工审批卡点。
别忘了 post 部分的条件收尾
构建结束后的动作也需条件判断,比如失败时发钉钉、成功时推镜像、不稳定时保留日志。`post` 支持 success、failure、unstable、aborted 和 always 等块,每个都可嵌套 `script` 做进一步判断,避免无效通知或资源泄漏。
- 仅当构建失败且非手动中止时发送告警:
failure { script { if (currentBuild.result != 'ABORTED') { sh 'curl -X POST ...' } } } - 无论成败都清理临时目录,但只在 Linux 节点执行:
always { script { if (env.OS == 'Linux') { sh 'rm -rf /tmp/build-*' } } }


















