温馨提示×

Ubuntu Jenkins怎样进行版本回滚

小樊
46
2025-11-02 12:56:59
栏目: 智能运维

Ubuntu环境下Jenkins实现版本回滚的常见方法

1. 基于Git Tag/Commit的回滚(适用于代码托管库管理的项目)

核心思路:通过Jenkins参数化构建获取目标版本(Tag或Commit ID),使用git resetgit checkout命令将代码回退到指定提交,再重新部署。
操作步骤

  • 前提准备:项目代码需提前打Tag(如v1.0)或记录关键Commit ID;Jenkins需安装Git插件,且配置好Git仓库地址及认证信息。
  • 配置参数化构建:在Jenkins Job中添加Choice Parameter(名称如version,选项为历史Tag列表,如v1.0v1.1)或String Parameter(让用户输入Commit ID)。
  • 编写回滚脚本:在构建脚本中添加以下逻辑(以Shell为例):
    case $status in
      rollback)
        echo "开始回滚到版本:$version"
        git reset --hard $version  # 或使用git checkout $version(保留工作区修改)
        echo "代码回退完成,开始部署..."
        # 后续部署命令(如scp到服务器、重启服务等)
        ;;
      *)
        echo "正常构建流程..."
        ;;
    esac
    
  • 执行回滚:构建时选择status=rollback并指定version参数,Jenkins会自动拉取指定提交并部署。

2. 基于备份文件的回滚(适用于无Git管理的本地项目)

核心思路:每次构建后将代码或包(如.jar.war)备份到Jenkins工作目录或远程服务器,回滚时取出对应备份文件覆盖当前版本。
操作步骤

  • 备份配置:在正常构建的Post-build Actions中添加Archive the artifacts,设置备份路径(如**/*.jar);或在构建脚本中添加备份命令(如tar czf ${JOB_NAME}-${BUILD_NUMBER}.tar.gz *,将文件存到${WORKSPACE}/bak目录)。
  • 编写回滚脚本:通过BUILD_NUMBER定位备份文件,覆盖当前版本并重启服务(示例):
    #!/bin/bash
    BACKUP_DIR="/var/lib/jenkins/workspace/${JOB_NAME}/bak"
    TARGET_DIR="/var/www/html"  # 部署目录
    
    if [ -z "$version" ]; then
      echo "未指定回滚版本,退出!"
      exit 1
    fi
    
    BACKUP_FILE="${BACKUP_DIR}/${JOB_NAME}-${version}.tar.gz"
    if [ ! -f "$BACKUP_FILE" ]; then
      echo "备份文件不存在:$BACKUP_FILE,退出!"
      exit 1
    fi
    
    echo "正在恢复备份文件:$BACKUP_FILE"
    rm -rf "$TARGET_DIR"/*  # 清空当前目录
    tar xzf "$BACKUP_FILE" -C "$TARGET_DIR"  # 解压备份
    echo "备份恢复完成,服务已回滚到版本:$version"
    
  • 执行回滚:构建时通过Build with Parameters指定version(如123,对应第123次构建),Jenkins会自动取出备份文件并部署。

3. 基于Docker镜像的回滚(适用于容器化项目)

核心思路:通过Jenkins构建时打Tag(如时间戳或版本号),将镜像推送到镜像仓库(如Harbor),回滚时拉取指定Tag的镜像并重启容器。
操作步骤

  • 构建时打Tag:在Jenkins构建脚本中添加docker build -t registry.example.com/project:${BUILD_TIMESTAMP}(或使用Git Commit ID作为Tag)。
  • 推送镜像到仓库:使用docker push将镜像推送到镜像仓库。
  • 编写回滚脚本:通过kubectldocker命令拉取指定Tag的镜像并重启容器(示例):
    #!/bin/bash
    IMAGE_NAME="registry.example.com/project"
    TAG=$1  # 通过参数传入回滚Tag
    CONTAINER_NAME="project-container"
    
    echo "正在拉取镜像:${IMAGE_NAME}:${TAG}"
    docker pull "${IMAGE_NAME}:${TAG}"
    
    echo "重启容器:${CONTAINER_NAME}"
    docker stop "${CONTAINER_NAME}" && docker rm "${CONTAINER_NAME}"
    docker run -d --name "${CONTAINER_NAME}" -p 8080:8080 "${IMAGE_NAME}:${TAG}"
    echo "回滚完成,当前版本:${TAG}"
    
  • 执行回滚:构建时通过Build with Parameters指定TAG(如202511011200),Jenkins会自动拉取指定镜像并重启容器。

4. 基于Kubernetes的回滚(适用于容器编排项目)

核心思路:通过Jenkins更新Kubernetes Deployment的镜像版本,回滚时使用kubectl rollout undo命令恢复到上一个稳定版本。
操作步骤

  • 部署时打Tag:构建时为镜像打上版本Tag(如v1.0),并推送到镜像仓库。
  • 更新Deployment:使用kubectl set image命令更新Deployment的镜像版本(示例):
    kubectl set image deployment/project-deployment project=${IMAGE_NAME}:${TAG} -n default
    
  • 执行回滚:若更新后发现异常,使用以下命令回滚到上一个版本:
    kubectl rollout undo deployment/project-deployment -n default
    
  • 验证状态:使用kubectl rollout status deployment/project-deployment -n default查看回滚进度。

注意事项

  • 备份策略:无论使用哪种方法,建议定期清理备份文件(如保留最近10次构建的备份),避免磁盘空间不足。
  • 权限控制:确保Jenkins有足够的权限访问Git仓库、备份目录、服务器或Kubernetes集群。
  • 测试验证:回滚前建议在测试环境验证备份文件或镜像的可用性,避免因备份损坏导致二次故障。

以上方法可根据项目类型(代码托管、本地文件、容器化、Kubernetes)选择使用,其中基于Git Tag基于Kubernetes Rollback是最常用的自动化回滚方案。

0