jenkins流水线条件分支分两种:声明式用when实现静态条件控制(如分支、环境变量、参数判断),脚本式用script+groovy if/else处理动态逻辑(如读文件、调api);两者可混合使用,when用于粗筛,script用于细判。

在 Jenkins 流水线中写条件分支,核心是区分语法类型:声明式(Declarative)用 when 控制阶段是否执行;脚本式(Scripted)或需动态逻辑时用 script + Groovy 的 if/else。两者不是互斥的——声明式 Pipeline 里也能嵌入 script 块做复杂判断。
用 when 实现静态条件控制(推荐多数场景)
when 是声明式 Pipeline 的标准条件开关,语法简洁、校验严格、日志清晰。它不支持任意 Groovy 表达式,但覆盖了常见触发场景:
- 按分支名:
when { branch 'main' }或when { branch 'feature/**' } - 按环境变量:
when { environment name: 'DEPLOY_ENV', value: 'prod' } - 按构建参数:
when { expression { return params.SKIP_TEST == true } } - 组合多个条件:
when { allOf { branch 'main'; environment name: 'CI', value: 'true' } }(全部满足才执行) - 取反逻辑:
when { not { branch 'develop' } }
用 script + if 处理动态或复杂判断
当需要读文件、调 API、解析 JSON、做多级嵌套判断,或复用已有 Groovy 函数时,必须进入 script 块。注意:在声明式 Pipeline 中,script 必须放在 steps 内部。
- 判断代码变更是否含特定文件:
script { if (readFile('pom.xml').contains('spring-boot-starter-web')) { sh 'mvn test' } } - 根据 Git 提交信息跳过部署:
script { if (env.GIT_COMMIT != null && sh(script: 'git log -1 --oneline | grep -q "\[skip-ci\]"', returnStatus: true) == 0) { echo '跳过构建' } else { sh 'make build' } } - 多分支逻辑分支(类似 switch):
script { def b = env.BRANCH_NAME; if (b == 'dev') { sh 'deploy-to-dev' } else if (b == 'test') { sh 'deploy-to-test' } else { echo '仅 dev/test 分支允许部署' } }
避免常见陷阱
条件逻辑看似简单,但容易因作用域、执行时机或语法层级出错:
- when 不支持跨 stage 变量赋值:它只看当前构建上下文(如参数、分支、环境变量),不能用前面 stage 里 set 的变量
-
expression 里的 return 不可省略:
when { expression { params.DEBUG_BUILD } }会报错,必须写return params.DEBUG_BUILD - script 块外不能用 if:在声明式 Pipeline 的 stages 外、或 stage 标签外直接写 if,Jenkins 会拒绝解析
- changelog/changeset 条件依赖 SCM 插件正确配置:若未拉取完整历史或禁用变更集采集,这些条件始终为 false
混合使用更灵活
实际项目中常组合使用:用 when 快速过滤明显不匹配的 stage,再用 script 在内部做细粒度决策。例如:
stage('运行集成测试') {
when {
allOf {
branch 'main'
expression { return params.RUN_INTEGRATION_TESTS == true }
}
}
steps {
script {
def coverage = sh(script: 'cat coverage.txt | grep -oP "\d+(?=\%)"', returnStdout: true).trim() as Integer
if (coverage >= 80) {
sh 'mvn verify'
} else {
error "覆盖率 ${coverage}% 低于阈值 80%"
}
}
}
}











