同一份jenkinsfile通过参数化+条件分支+动态源控制实现按git tag或branch自动路由:feature分支走测试流程,release分支触发预发部署,tag构建生产镜像。

要让一条 Jenkins 流水线能根据 Git Tag 或 Branch 自动识别、过滤并执行不同路径(比如:feature 分支走测试流程,release 分支触发预发部署,tag 构建生产镜像),关键不是写多条流水线,而是用“参数化 + 条件分支 + 动态源控制”三者协同。核心目标是:同一份 Jenkinsfile,一次配置,按需路由。
一、前置准备:装对插件、配好凭证
确保以下组件就绪,缺一不可:
- Git Parameter 插件(v0.9.16+):用于构建前动态拉取分支/Tag 列表;在“系统管理 → 插件管理 → 可选插件”中搜索安装,重启 Jenkins 生效。
- Git Plugin(v4.10.0+):基础 Git 集成,支持 refspec、fetch 深度等高级选项。
- SSH 或 HTTPS 凭证已配置:Jenkins 必须能免密访问你的 Git 仓库(如 GitHub/GitLab/Gitee)。私有库推荐用 SSH Key,公钥需添加到 Git 服务端对应账号的 Deploy Keys 或用户 SSH Keys 中。
二、参数定义:区分 Branch 与 Tag 的双模式选择
在流水线配置中启用“参数化构建过程”,添加两个独立 Git 参数,避免混淆:
-
Branch 参数(
SELECTED_BRANCH):
type =PT_BRANCH,
branchFilter =origin/(?!main|master|develop).*(正则排除主干,只显 feature/hotfix/release 等);
defaultValue =develop -
Tag 参数(
SELECTED_TAG):
type =PT_TAG,
tagFilter =v[0-9]+\.[0-9]+\.[0-9]+.*(匹配语义化版本如 v1.2.3、v2.0.0-rc1);
defaultValue = 留空或设为最新 tag(插件支持defaultProperty: [key: 'defaultValue', value: 'latest'])
⚠️ 注意:两个参数设为“可选”,但逻辑上互斥——构建时只填其一,后续脚本靠非空判断路由。
CNB 云原生构建平台的 Git 操作技能,支持代码克隆、提交、推送、分支管理、Merge Request 管理、流水线触发与结果读取。初次使用需收集用户的 Git 用户名和邮箱。
三、Jenkinsfile 路由逻辑:用环境变量驱动 stage 分支
在 pipeline { ... } 内,不硬编码分支名,而是用 params.SELECTED_BRANCH 或 params.SELECTED_TAG 做条件判断:
- 先 checkout 对应目标(Branch 或 Tag):
checkout([$class: 'GitSCM', branches: [[name: "refs/tags/${params.SELECTED_TAG}"]], ...])(拉 tag)
或checkout([$class: 'GitSCM', branches: [[name: "origin/${params.SELECTED_BRANCH}"]], ...])(拉分支) - 再按命名规范做路由决策:
若params.SELECTED_BRANCH?.startsWith('feature/')→ 执行单元测试 + 构建 dev 镜像 + 推送至测试仓库
若params.SELECTED_BRANCH?.startsWith('release/v')→ 执行集成测试 + 构建预发包 + 部署到 staging 环境
若params.SELECTED_TAG非空 → 执行签名验证 + 构建 prod 镜像 + 推送至生产仓库 + 触发通知
所有路径共用同一套编译、打包逻辑,仅部署目标和质量门禁不同,真正实现“一份脚本,多重路由”。
四、增强可靠性:加缓存、控权限、防误操作
生产环境建议补充三项优化:
- 分支/Tag 列表缓存控制:在 Git Parameter 配置中勾选 “Use cache for tags/branches”,并设 refresh interval(如 300 秒),避免每次构建都全量请求 Git 服务器。
-
敏感操作权限隔离:对触发生产部署(tag 构建)的流程,启用 Jenkins 的 Role-Based Authorization Strategy 插件,限制只有
prod-deployer角色可选 tag 并构建。 -
防误选保护机制:在 pipeline 开头加校验 step:
script { if (params.SELECTED_TAG && params.SELECTED_BRANCH) { error '不能同时选择 Branch 和 Tag,请清空其中一个' } }
不复杂但容易忽略










