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 JenkinsManage 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 StepsExecute 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
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐