Jenkins 参数化构建实战:实现指定分支部署与 Git Commit 回滚
Jenkins 参数化构建实战:实现指定分支部署与 Git Commit 回滚
在日常开发中,我们经常需要面对以下场景:
- 多环境部署:同一套代码需要部署到开发、测试、生产等多个环境
- 快速回滚:线上出现问题时,需要迅速回滚到之前的稳定版本
- 指定版本发布:需要发布某个特定的 Git 提交版本,而非最新代码
本文将介绍如何通过 Jenkins 的参数化构建功能,配合 Shell 脚本实现指定分支构建和基于 Git Commit ID 的版本回滚。
一、最终效果预览
构建时,Jenkins 会弹出参数选择框:
| 参数 | 类型 | 说明 |
|---|---|---|
deploy_environment |
选项 | deploy(部署)/ rollback(回滚) |
rollback_commit_id |
字符串 | 回滚的 Commit ID,不填则回滚最近一次 |
branch |
Git 参数 | 选择要构建的分支 |


二、核心配置步骤
1. 开启参数化构建
进入 Jenkins Job 的 Configure 页面,勾选 “参数化构建过程”(This project is parameterized)。
2. 添加选项参数:操作类型
参数类型:Choice Parameter(选项参数)
| 配置项 | 值 |
|---|---|
| 名称 | deploy_environment |
| 选项 | deploy(换行)rollback |
| 描述 | 参数是部署(deploy)、回滚(rollback) |
> 部署时选择 deploy,需要回滚时选择 rollback。
3. 添加字符串参数:回滚 Commit ID
参数类型:String Parameter(字符串参数)
| 配置项 | 值 |
|---|---|
| 名称 | rollback_commit_id |
| 默认值 | 留空 |
| 描述 | 回滚到对应 commit 提交,不填写则回滚最近一次。当部署(deploy)时,忽略此参数 |
> 支持输入完整的 Commit Hash 或短 Hash(如 a3f2b1c),不填则自动回滚到上一次提交。
4. 添加 Git 参数:选择分支
参数类型:Git Parameter(需要安装 Git Parameter 插件)
| 配置项 | 值 |
|---|---|
| 名称 | branch |
| 参数类型 | Branch |
| 默认值 | origin/master |
| 描述 | 选择要构建的分支 |
> 安装插件:Manage Jenkins → Manage Plugins → 搜索 Git Parameter
5. 源码管理配置
在 Source Code Management 中选择 Git:
| 配置项 | 值 |
|---|---|
| Repository URL | 你的 Git 仓库地址 |
| Credentials | Git 凭据 |
| Branches to build | ${branch}(引用上面定义的 branch 参数) |
> 关键点:Branches to build 填写 ${branch},实现动态分支选择。
6. 重点补充!!!
如果jenkins构建莫名卡顿超时或执行失败,可能是没有下载rsync,记得远程服务和本地服务都要安装一下哦,确保万无一失~~
centos:yum install rsync
ubantu: sudo apt update && sudo apt-get install rsync
补充2:如果ssh每次拉取会出现一致卡在执行脚本上很大可能是没有配置jenkins至其他服务器之间免密钥ssh登录,这个是你安装了Publish Over SSH 插件后,配置好依旧无法执行的问题所在!!!
生成免密码ssh密钥(部署jenkins的服务器)ssh-keygen -t rsa
传输公钥至部署代码的服务器ssh-copy-id root@远程服务器IP
三、构建脚本
在 Build Steps → Execute shell 中添加以下脚本:
#!/bin/bash
set -e # 遇到错误立即退出
REMOTE_IP="远程服务器IP"
# ---------- 1. 确定目标路径 ----------
if [ "$branch" == "origin/master" ]; then
dest="/www/wwwroot/master-jenkins-test"
git_branch="master"
else
dest="/www/wwwroot/test-jenkins-test"
git_branch="test"
fi
# ---------- 2. 部署 ----------
if [ "$deploy_environment" == "deploy" ]; then
echo "🚀 部署 $branch"
# 检查 rsync 是否存在
if ! command -v rsync &> /dev/null; then
echo "❌ rsync 命令不存在,请先安装"
exit 1
fi
rsync -avz --delete \
--exclude='.git' \
--exclude='vendor' \
--exclude='runtime' \
--exclude='uploads' \
./ "root@$REMOTE_IP:$dest" || {
echo "❌ rsync 同步失败"
exit 1
}
echo "✅ 部署完成"
# ---------- 3. 回滚 ----------
elif [ "$deploy_environment" == "rollback" ]; then
echo "↩️ 回滚 $branch"
# 检查 rsync 是否存在
if ! command -v rsync &> /dev/null; then
echo "❌ rsync 命令不存在,请先安装"
exit 1
fi
# 不填则回滚最近一次提交
if [ -z "$rollback_commit_id" ] || [ "$rollback_commit_id" == "0" ]; then
rollback_commit_id=$(git rev-parse --short HEAD~1) || {
echo "❌ 获取最近一次 commit 失败"
exit 1
}
echo "未指定 commit_id,回滚到最近一次: $rollback_commit_id"
else
echo "指定 commit_id: $rollback_commit_id"
fi
# 验证 commit 是否存在(统一验证)
if ! git cat-file -e $rollback_commit_id 2>/dev/null; then
echo "❌ commit_id 不存在: $rollback_commit_id"
exit 1
fi
echo "当前提交: $(git rev-parse --short HEAD)"
# 强制切到指定 commit
git checkout -f $rollback_commit_id || {
echo "❌ git checkout 失败"
exit 1
}
echo "已切换到: $(git rev-parse --short HEAD)"
echo "当前文件列表:"
ls -la
# 同步代码
rsync -avz --delete \
--exclude='.git' \
--exclude='vendor' \
--exclude='runtime' \
--exclude='uploads' \
./ "root@$REMOTE_IP:$dest" || {
echo "❌ rsync 同步失败"
exit 1
}
# 切回原分支
git checkout -f $git_branch || {
echo "❌ 切回原分支失败"
exit 1
}
echo "✅ 回滚完成"
else
echo "❌ deploy_environment 只能是 deploy 或 rollback"
exit 1
fi
更多推荐




所有评论(0)