---
description: 有时候可能代码提交上去了，但是发现有个BUG，这时候就需要回滚到历史的版本中了
---

# Jenkins 版本回滚

* 接上章前端自动化部署  vue&#x20;

### **配置参数化构建过程**

* 选项参数
* 字符参数

<figure><img src="https://2134947750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvILwbD2PrkBCkSitM3m4%2Fuploads%2FSsugSM8zh5zQbBzwacgq%2Fimage.png?alt=media&#x26;token=3b7c2a48-7535-4883-8c64-38bb201d713f" alt=""><figcaption></figcaption></figure>

### 打包备份脚本

**jenkins内置变量**

* WORKSPACE： 作为工作空间分配给构建目录的绝对路径。
* JOB\_NAME： 此版本的项目名称
* BUILD\_NUMBER： 当前版本号(是 Jenkins 运行任务的版本)

<figure><img src="https://2134947750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvILwbD2PrkBCkSitM3m4%2Fuploads%2FXe5o5MbyeMKpJOO47sd6%2Fimage.png?alt=media&#x26;token=cc57fb39-23a7-4b8b-a9bd-834b3d488d28" alt=""><figcaption></figcaption></figure>



> 如果选择“<mark style="color:orange;">Deploy</mark>”就执行创建文件夹（用于保存压缩后的文件），然后执行压缩文件
>
> 如果选择”<mark style="color:orange;">RollBACK</mark>”，获取到要回滚的BUILD\_NUMBER，查找到文件内容包含 BUILD\_NUMBER的压缩文件，我就把这个文件复制成为最新的构建文件。





### 备份回滚脚本

> 考虑到会经常打包部署，如果每次都备份的话，那么磁盘会不够用，我们在这里设置一个自动删除机制

<figure><img src="https://2134947750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvILwbD2PrkBCkSitM3m4%2Fuploads%2FC2AS5drFAShnlIby20Wb%2Fimage.png?alt=media&#x26;token=ce4dedf0-ea4f-4fdd-8acd-6aeaad9eecec" alt=""><figcaption></figcaption></figure>

### 发布

> 发布选择Deploy--->开始构建，即可开始发布。

<figure><img src="https://2134947750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvILwbD2PrkBCkSitM3m4%2Fuploads%2Fe2C0RbEEKnQvXQnkr1fh%2Fimage.png?alt=media&#x26;token=c551c78c-28d6-4166-84ba-20b1bd7cac96" alt=""><figcaption></figcaption></figure>



### 回滚

> 回滚选择Rollback--->输入回滚版本---->开始构建，版本号从构建历史中选择一个输入

<figure><img src="https://2134947750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvILwbD2PrkBCkSitM3m4%2Fuploads%2F9tscD26Rk753zPEgxRaa%2Fimage.png?alt=media&#x26;token=58807cef-87be-43fa-9e0a-48b651feaf83" alt=""><figcaption></figcaption></figure>

### 代码部分

**回滚备份 Shell 代码**

```bash
#!/bin/bash

function vue_build()
{
    node -v 
    npm -v 
    rm -rf package-lock.json
    echo "npm install"
    npm run build
    tar zcvf dist.tar.gz ./dist
}


case $Status  in
  Deploy)
    echo "Status:$Status"
    path="${WORKSPACE}/bak/${BUILD_NUMBER}"    # 创建每次要备份的目录
    if [ -d $path ];
    then
        echo "The files is already  exists "
    else
        mkdir -p  $path
    fi


    vue_build                                 # 调用 nodejs 编译打包


    \cp -f ${WORKSPACE}/*.tar.gz $path        # 将打包好的压缩包备份到相应目录,覆盖已存在的目标
    echo "Completing!"
    ;;
  Rollback)
      echo "Status:$Status"
      echo "Version:$Version"
      cd ${WORKSPACE}/bak/$Version            # 进入备份目录
      \cp -f *.tar.gz ${WORKSPACE}/           # 将备份拷贝到程序打包目录中，并覆盖之前的压缩包
      ;;
  *)
  exit
      ;;
esac

```



**自动删除历史老旧备份**

```bash
#!/bin/bash
echo "开始清除老旧版本备份......"
ReservedNum=10                         # 备份保量数
FileDir=${WORKSPACE}/bak/              # 备份目录
date=$(date "+%Y%m%d-%H%M%S")          # 删除备份日期
cd $FileDir                            # 进入备份目录
FileNum=$(ls -l | grep '^d' | wc -l)   # 当前有几个文件夹，即几个备份

while [[ ${FileNum} -gt ${ReservedNum} ]]; do
    echo "开始执行删除"
    OldFile=$(ls -rt | head -1)          # 获取最旧的那个备份文件夹
    echo  $date "Delete File:"$OldFile
    rm -rf $FileDir/$OldFile
    let "FileNum--"
done 

```
