jenkins多分支回滚-总结文

jenkins多分支回滚-总结文
  做了差不多一周的东西,今天算是搞完了,测试测得都有点晕了~~~
  可能大家会有点乱,最近这几篇jenkins分支版本号测试的文章,主要围绕的需求是:每次点击jenkins发布,能修改版本号文件(.env)的版本号,并同步回giltab,开发写的程序貌似会读这个文件,到时用户使用的时候会看到当前版本号。
  至于后面的多分支发布、jenkins控制台显示对应版本号,根据分支版本号备份,根据分支回滚想要的版本,这些通通都是我自己扩展想完善好的。前面几篇文章算是一步步走过的坑。
  这篇做个总结(之后五一要好好休息 = =),顺便介绍如何做到多分支回滚的,不知道有没有大bug,因为还没交差,小bug倒是想到一个。
  整个演示:模拟从选择多分支发布,备份旧版本号,最后回滚的场景。
  总共用到两个任务:多分支多版本号备份 和 多分支回滚。
一、实现思路
1、jenkins根据分支进行发布:
(1)发布前jenkins控制台显示版本号:利用jenkins服务运行用户,根据选择发布的分支,显示目前版本号(old_version)和将要发布的版本号(new_version),不同的分支会读取不同的版本号文件:{项目关键字}-${分支号}_version.txt
  对应jenkins任务的“多分支多版本号备份”参数化构建过程的: old_version 和 new_version 定义
(2)更新版本号,编译代码,并将版本号同步回gitlab上:向(1)的版本号文件写入:版本号、新版本号(new_ver)、发布时间,用于控制台下次发布显示版本号的;
  并且,jenkins运行用户通过ssh去调用jenkins服务器上的另一个普通用户的脚本,用于更新.env文件到gitlab上。
  对应jenkins任务的“多分支多版本号备份”构建配置里的:
ssh {jenkins服务器上的一个普通用户}@{jenkins服务器上的ip} "sh -x /home/{普通用户}/scripts/update_version/update_admin.sh $branch"

  为什么用到该用户?主要是因为直接在jenkins工作区间,同步回.env文件到gitlab上,会报错,可以看回之前文章。

(3)编译后得到发布到远程机器上的目录dist(里面有发布到远程的文件),新建一个发布信息文件(用于后面远程机器发布前备份的):version.txt,记录分支号,上一个版本号(old_ver),发布的版本号(new_ver),将dist目录和发布信息文件压缩成一个压缩包:{项目关键字}-${分支号}_${new_ver}.tar.gz
   突然发现version.txt 记录的 old_ver 是没用的,因为远程机器运行目录不一定是这个发布分支的上一个版本号
2、远程机器备份和发布:发布压缩包会传到一个临时目录(DIST_DIR),远程机器事先会新建一个版本发布记录文件,这个文件是用于后面回滚的。
版本发布记录文件命名:Deploy-{项目关键字}.log
文件内容格式:项目关键字、版本号、当前发布版本号、发布时间(Deploy_Log)
  想想如果没有这个文件,就不知道当前运行目录究竟跑的是哪个分支的哪个版本号。回滚前的备份旧包就不好命名了。
 
3、回滚:jenkins控制台根据选择的分支显示该分支的版本号,可以选择这版本号前的版本进行恢复。在jenkins构建配置里,要更新版本号文件:{项目关键字}-${分支号}_version.txt(用于下一次发布jenkins控制台显示版本号),且更新版本号文件到gitlab上(.env的版本号改为回滚的版本号)
对应jenkins任务的“多分支回滚”构建配置里的:
echo admin $branch ${rollback_version} $DATE rollback >> /var/lib/jenkins/scripts/xxx/get_version/admin/${branch}/admin-${branch}_version.txt

  行尾添加一个关键字rollback是为了区分正常发布的,例如下面的test分支,v1.0.6这行表示做了回滚v1.0.6的版本。

   更新.env到gitlab,对应构建里的

ssh {jenkins服务器上的一个普通用户}@{jenkins服务器上的ip} "sh -x /home/{普通用户}/scripts/xxx/update_version/rollbackver_admin.sh ${branch} ${rollback_version}"

  远程机器运行回滚脚本,对应jenkins任务的“多分支回滚” 的“构建后操作”   :

sh -x /home/xxx/script/test/rollback_admin.sh ${branch} ${rollback_version}

  去备份目录找到回滚的包名,备份原包(借助版本发布记录文件),再发布回滚包

二、实现配置
只贴关键,上几篇文章没提到的
1、jenkins任务的:多分支多版本号备份 
构建后操作的发布脚本:
 
(1)发布脚本(远程机器上运行):  
#!/bin/bash

## 版本号、分支号
Branch=$1
echo "发布分支:" $Branch

## 记录当前运行的分支和版本号
Dir=/home/xxx/wars/muti-branch
## 有bug,不能分 ${Branch}存放, 要一起共用 #### Deploy_Log
=${Dir}/Deploy-admin-${Branch}.log

  Deploy_Log=${Dir}/Deploy-admin.log


## jenkins拷贝过来的临时目录
DIST_DIR=/home/xxx/wars/admin
cd ${DIST_DIR}

Tar_FileName=`ls -lht *${Branch}*.tar.gz | head -n1 | awk '{print $9}'`

## 解压目录名
FileName=`echo ${Tar_FileName/.tar.gz/}`
tar -xvf ${Tar_FileName}

cd ${FileName}

## 获取上一次和这次的版本号, old_version 是不需要记录的
### old_version=`cat version.txt | awk '{print $2}'`
new_version=`cat version.txt | awk '{print $3}'`

DATE=`date +%Y%m%d_%H:%M:%S`
  ## 获取对上一次发布的分支号,上面的 old_version 是错的,不一定上次发布是同一个分支
lastBranch=`tail -n1 ${Deploy_Log} | awk '{print $2}'
lastVersion=`tail -n1 ${Deploy_Log} | awk '{print $3}'`
# 写入版本发布记录文件
echo admin ${Branch} ${new_version} ${DATE} >> ${Deploy_Log} ## 备份目录 BAK_DIR=/home/xxx/data/bak/xxx #备份目录,不存在就创建 [ ! -d $BAK_DIR ] && mkdir -p $BAK_DIR ## 发布目录 DEPLOY_DIR=/home/xxx Admin_DIR=${DEPLOY_DIR}/admin ## 1、备份原目录 if [ -d ${Admin_DIR} ]; then if [ ! -d ${BAK_DIR}/admin ]; then mkdir -p ${BAK_DIR}/admin fi /bin/mv ${DEPLOY_DIR}/admin ${BAK_DIR}/admin/admin-${lastBranch}_${lastVersion}_$DATE fi ## 2、发布目录,不存在就创建 [ ! -d ${Admin_DIR} ] && mkdir -p ${Admin_DIR} ## 3、发布代码 /bin/cp -rp ${DIST_DIR}/${FileName}/dist/* ${Admin_DIR}/

exit 0
 
2、jenkins任务的:多分支回滚
(1)构建
注意:这个rollbackver_admin.sh 是在 jenkins服务器上的普通用户运行

更新回滚版本号到gitlab脚本(jenkins机器上运行)

rollbackver_admin.sh

 1 #!/bin/bash
 2 
 3 #######################################################
 4 # $Name:        rollback_admin.sh
 5 # $Version:     v1.0
 6 # $Function:    回滚:xxx项目的-前端版本号
 7 # git目录:     /home/xxx/app/update_version/
 8 
 9 #######################################################
10 
11 ## 1、拉取的分支
12 Rollback_Branch=$1
13 Rollback_Version=$2
14 
15 
16 ## 2、拉取的目录,项目名
17 Git_Dir=/home/xxx/app/update_version/xxx
18 Admin_Dir=${Git_Dir}/admin
19 
20 cd ${Git_Dir}
21 
22 ## 不存在就克隆仓库
23 if [ ! -d ${Admin_Dir} ]; then
24    git clone -b ${Pull_Branch} ssh://xxx/xxx/xxx.git
25 
26 ## 存在就判断是否是回滚分支
27 ## 更新最新代码
28 else
29    cd ${Admin_Dir}
30    br=`git branch |grep "*"`
31    localbr=`echo ${br/* /}`
32    
33    # 切换到回滚分支
34    if [ "${localbr}" != "${Rollback_Branch}" ]; then
35        git checkout ${Rollback_Branch}
36    fi
37    # 更新回滚分支的最新代码
38    git pull origin ${Rollback_Branch}
39 fi
40 
41 ## 3、更新版本号
42 cd ${Admin_Dir}
43 src_ver=`cat .env |awk -F'=' '{print $2}' | tr  -d "'"`
44 sed -i "s/${src_ver}/${Rollback_Version}/" .env   
45 
46 ## 4、上传代码
47 git add .env
48 git commit -m "rollback .env version"
49 git push origin ${Rollback_Branch}:${Rollback_Branch}
View Code

 

(2)构建后操作
 
远程机器上运行:
rollback_admin 脚本
#!/bin/bash

#######################################################
# $Name:        rollback_admin.sh
# $Version:     v1.0
# $Function:    根据选择的分支,回滚版本号

#######################################################

## 0、参数传入,变量定义
# 传入回滚版本号、分支号
Branch=$1
Rollback_Version=$2
DATE=`date +%Y%m%d_%H:%M:%S`

# 版本发布记录文件, 回滚也写
Dir=/home/xxx/wars/muti-branch
Deploy_Log=${Dir}/Deploy-admin.log

# 总备份目录
BAK_DIR=/home/xxx/data/bak/xxx
Admin_BAK_DIR=${BAK_DIR}/admin

# 发布目录 - 测试ljy
DEPLOY_DIR=/home/xxx
Admin_DIR=${DEPLOY_DIR}/admin

## 1、找回滚的包名,不需要解压
Rollback_Pkg=`ls -lht ${Admin_BAK_DIR} | grep "admin-${Branch}_${Rollback_Version}" | head -n1 |  awk '{print $9}'`
if [ -z "${Rollback_Pkg}"  ]; then
    echo "找不到回滚的包,退出程序!!!"
    exit 1
fi

##找到要回滚的包名
echo "要回滚的包名:" ${Rollback_Pkg}

## 2、回滚包
#2.1 备份原包
## 原包的版本号
## 最后一行是上次发布包版本
old_version=`tail -n1 ${Deploy_Log} | awk '{print $3}'`

### 有bug,不是用传过来的 ${Branch},而是 ${Deploy_Log} 最近一行的分支名
#### mv ${Admin_DIR} ${Admin_BAK_DIR}/admin-${Branch}_${old_version}_rollbackto_${Rollback_Version}_$DATE

lastBranch=`tail -n1 ${Deploy_Log} | awk '{print $2}'`
mv ${Admin_DIR} ${Admin_BAK_DIR}/admin-${lastBranch}_${old_version}_rollbackto_${Rollback_Version}_$DATE


#2.2 发布回滚包
# 回滚包
cd ${Admin_BAK_DIR}   #进去备份目录

# 发布回滚包
[ ! -d ${Admin_DIR} ] && mkdir -p ${Admin_DIR}
cp -rp ${Rollback_Pkg}/* ${Admin_DIR}/

# 该文件用于测试
echo ${DATE} ${Rollback_Version} 回滚 >> ${Admin_DIR}/testfile


## 3、更新版本发布记录文件
echo admin ${Branch} ${Rollback_Version} $DATE rollback >> ${Deploy_Log}

 Deploy-admin.log 记录内容示例:

 

、回滚测试效果图

 分支test,当前运行的版本号为:v1.0.8,需要回滚到v1.0.6
1、远程机器上记录了最近一次发布包的分支和版本号
Deploy-admin.log

 

 2、备份目录有之前的备份包:

其中v1.0.6的文件时间为:2022年 4月 27日的 16:18

 3、多分支回滚

 

  4、发布完检查:

(1)gitlab版本号更新:
从 1.0.8 变为 1.0.6

 (2)控制台显示当前版本号为:v1.0.6

 (3)jenkins机器版本信息记录文件

最后标记(rollback)代表回滚了该版本号

(4)远程机器检查:

(i)运行目录恢复了v1.0.6的文件:

 用于标记回滚成功的测试文件(testfile)也存在

 

(ii)当前运行目录的版本记录文件(对上一次发布的版本)
更新了最近一次是回滚的版本号

 

 

 (iii)备份目录有回滚前的运行目录版本号的备份包(v1.0.8)

rollbackto_v1.0.6,跟正常发布备份区分开

  注意:版本回滚读取的分支号要从 ${Deploy_Log} 最新一行去取,而不是直接根据传入的版本参数进行备份,已修正发布脚本和回滚脚本的:${Deploy_Log}

  如果有其他bug,欢迎读者指出,不胜感激~~~ 【^___^】 

posted @ 2022-04-28 22:38  windysai  阅读(397)  评论(0编辑  收藏  举报