利用jenkins的参数化构建+shell脚本的方式,保留最近5份的war包备份,进行jenkins的版本回退操作,必须安装jenkins的管理插件(Active Choices Plug-in),在rollback时,动态显示最近版本信息。
本流程中的目录及路径说明
war包备份目录:/app/version_backup
docker镜像打包目录: /app/dockerfile
deploy发布的思路:
- 每次发布的时候填写version(变量$version)版本(可以自增加,也可以让用户自己填,我们是填日期)
- 如果用户选择deploy
- 先判断备份的$version目录是否存在
- 如果/app/version_backup/$version备份目录已经存在,则退出运行。
- 如果/app/version_backup/$version备份目录不存在,则创建目录。
- 把war包拷贝到此目录备份,然后再把war包拷贝到/app/dockerfile下,制作新的镜像。
rollback回退的思路:
- 如果是Rollback,用户选择对应的回退版本(通过active choice plug-in动态显示)
- 先判断备份目录下的$RollbackVersion是否存在
- 如果/app/version_backup/$RollbackVersion目录不存在,则退出运行。
- 如果/app/version_backup/$RollbackVersion目录存在,则继续下一步。
- 把war包从/app/version_backup/$RollbackVersion拷贝到/app/dockerfile下,制作新的镜像。
1.active choice plug-in的配置
1)指定参数status,用户可以选择Deploy或者Rollback。
2)这里选字符参数,指定参数Version,只有在用户发布时使用,用户可以自己填版本号,或者让版本号自增加也可以(从0开始)。
3)选择active choices reactive parameter,指定参数RollbackVersion,回退时使用,填写groovy script脚本,动态显示备份目录/app/version_backup下面的文件列表。
重点关注:Refrenced parameters一定要填!!!!。
其中groovy script的脚本内容如下:
path="/app/version_backup"
tags=['bash','-c',"ls -t1 ${path}"].execute().text.readLines()
if (Status.equals("Rollback")) {
return tags
}
2. 源码管理(git,按照自己的实际情况填)
3.触发器及pre steps设置
4.添加post steps(本地shell脚本执行),实现deploy或者rollback的备份、打包镜像、上传私有仓库的操作。
shell脚本如下(具体可以看#的说明):
#!/bin/bash
path=/app/version_backup/$Version
roll_path=/app/version_backup/$RollbackVersion
docker_build_path=/app/dockerfile
case $Status in
Deploy)
echo "Status:$Status"
if [ -d $path ];
then
echo "此发布版本已存在,请重新输入发布版本"
else
mkdir -p $path
echo "备份文件夹已建"
cp $WORKSPACE/target/bbs-5.7.war $path/
echo "war包已备份至对应的version目录"
rm -rf $docker_build_path/bbs-5.7.war && cp $WORKSPACE/target/bbs-5.7.war $docker_build_path
echo "war包已复制到docker build目录"
docker rmi 192.168.1.145:5000/cuanon-tomcat:VW
echo "镜像已删除完成"
cd $docker_build_path && docker build -t 192.168.1.145:5000/cuanon-tomcat:VW .
echo "打包镜像完成"
docker push 192.168.1.145:5000/cuanon-tomcat:VW
echo "推送私有仓库完成"
fi
;;
Rollback)
echo "Status:$Status"
if [ -d $roll_path ];
then
echo "有此版本$RollbackVersion的备份,将进行回退"
rm -rf $docker_build_path/bbs-5.7.war && cp $roll_path/bbs-5.7.war $docker_build_path
echo "war包$RollbackVersion已复制到docker build目录"
docker rmi 192.168.1.145:5000/cuanon-tomcat:VW
echo "删除现有镜像"
cd $docker_build_path && docker build -t 192.168.1.145:5000/cuanon-tomcat:VW .
echo "打包镜像完成"
docker push 192.168.1.145:5000/cuanon-tomcat:VW
echo "推送私有仓库完成"
else
echo "无此版本的回退,请重新输入回退版本"
fi
;;
esac
5.添加post steps(本地shell脚本执行) ,实现备份文件的删除(最大5份)
shell脚本如下:
#!/bin/bash
echo "开始删除超过5天的旧文件"
backup_path=/app/version_backup/
backup_copies=5
FILENUM=`ls -lrt /app/version_backup/ | grep ^d | wc -l`
while [ $FILENUM -gt $backup_copies ]
do
OLDEST_File=`ls -lrt $backup_path| grep ^d |awk '{print $9}' | head -1`
echo "最旧的文件夹: $OLDEST_File"
rm -rf /app/version_backup/$OLDEST_File
echo "文件夹: $OLDEST_File已删除"
let FILENUM--
done
6.继续添加post steps(远程执行shell脚本)远程应用服务器进行docker镜像的下载并运行。
shell脚本如下:
#远端容器执行 docker rm -f cuanon-bbs-vw && echo "删除容器完成" docker rmi 192.168.1.145:5000/cuanon-tomcat:VW && echo "删除image完成" docker pull 192.168.1.145:5000/cuanon-tomcat:VW && echo "下载image完成" docker run -d -p 1111:8080 --name cuanon-bbs-vw 192.168.1.145:5000/cuanon-tomcat:VW echo "启动容器完成"
以上配置完成后,将实现如下功能。
- 如果用户选择Deploy,则可以自己写version编号,也可以让jenkins自增。
如果用户选择Rollback,则可以选择对应的RollbackVersion版本。
配置完后直接运行,正常是没什么问题。



