需求:
有时线上代码通过Jenkins构建之后,会有一些bug及问题,导致构建完不能正常使用, 需要回退到之前的正常运行的版本代码,由于没有相关的自动回滚的措施,只能通过运 维手动去 *** 作,大大增加了出错风险,同时 *** 作需要一定时间。影响线上用户体验,故 想通过Jenkins去实现代码版本的回滚。
思路:
Jenkins每次构建都会有一个唯一的BUILD_NUMBER,可以通过这个num去实现回滚,每次构建时,通过对应的JOB_NAME和BUILD_NUMBER在服务器的备份目录下创建两级目录JOB_NAM/BUILD_NUMBER/XX.jar去备份构建的jar包,这样可以保证每个路径和jar包都是唯一。当构建完需要回滚到指定版本,也就是BUILD_NUMBER的时候,就可以在对应的目录下找到jar包去替换运行的jar包实现回滚
#步骤:
Jenkins创建用于回滚的自由风格的job:rollback
由于我这里有三个环境,故区分开创建了三个rollback JOB以防止误 *** 作,也可以通过 一个rollback加参数去选择回滚版本。以外测的回滚job为例展开说明
#这里需要用到三个参数
一:node参数
和回滚的项目运行的服务器一样。因为需要去对应服务器实现停止重启服务, 替换jar包,用到node这个参数,安装插件:Node and Label parameter后在添 加参数栏可以看到node选项
选择node参数后,对应选择服务运行的节点,如果你要运行的服务不在一台,这里Default nodes处留空,Possible nodes对应勾选上有对应的服务节点,然后每次在回滚时,根据项目去对应手动选择节点,支持ctrl多选。
二:选项参数
名称:rollback_job
选项:(根据你具体的job来)
api-sports-all
sport-api-agent
sport-api-custom
sport-api-manager
sport-scheduled
描述:(对应的说明。可不填)
选项这里对应每个项目的JOB_NAME ,选项参数实现的是告诉回滚job,需要回滚的是什么项目,kill和重启,以及替换的jar包,
三:字符参数
对应填写的需要回滚的版本号,也就是要回滚到的正常构建的BUILD_NUM,前面以及知道需要回滚的服务器以及需要回滚的项目,但是还不知道回滚的版本,这里就是回滚的版本号。
默认值设置为0,到时候shell语句加判断,rollback_num为0时不会滚,说明没有手动选择版本号,
对应的BUILD_NUM可以去每个具体的job的构建历史处找,对应前面的数字就是每次构建的number,每个job内都唯一。所以在回滚之前,需要手动确认回滚到的number。
四:Shell语句段
最后一步就是获取到三个参数后通过shell去服务器执行具体的回滚 *** 作了,
#!/bin/bash echo "开始执行 ${rollback_job} 的回滚 *** 作..." echo "回滚版本为:$rollback_num" echo "回滚的服务器为:${rollback_server}" echo "kill旧的程序..." ID=`ps -ef | grep "${rollback_job}" | grep -v "" | grep -v "grep" | awk '{print }'` if [ $rollback_num -ne 0 ];then for id in $ID do kill -9 $id echo "${rollback_job}已终止运行,pid为:$id" done echo "开始执行${rollback_job}服务的正确版本jar包的替换 *** 作" cp /home/app/jar-back/${rollback_job}/${rollback_num}/*.jar /home/app/script/ echo "开始重新启动正确版本的${rollback_job},版本为:$rollback_num" sleep 1s OLD_BUILD_ID=$BUILD_ID BUILD_ID="dontkillme" sh /home/app/script/${rollback_job}.sh BUILD_ID=$OLD_BUILD_ID sleep 1s echo "====================================" ps aux|grep ${rollback_job}| grep -v "grep" if [ $? -eq 0 ];then echo "=== rollback ok ===" else echo "=== rollback false ===" fi else echo "回滚版本为0,请填写正确版本号!" fi
注:
这里shell的含义就是先去判断输入的回滚号是否为0,为0说明没填值或者填值为0, 不执行回滚具体 *** 作,如果不为零,则开始执行。
1,通过grep 找出对应jar包的进程号kill掉
2,从/home/app/jar_back/这个备份目录里,根据获取到的job_name和build_number去获取jar包并复制替换到项目目录的jar包,
3,重启启动jar包,这里启动jar包的脚本我都统一改成JOB_NAME.sh,这样就可以多次利用JOB_NAME变量
完成上面4个步骤后,点击保存job就基本完成了。
通过这个rollback现在已经可以去实现代码的回滚了,但是回滚获取的jar包是需要每次构建具体项目时按照JOB_NAME和BUILD_NUMBER 去备份jar包 ,所以在回滚之前,我们得需要在每个具体的项目job内去添加备份jar包的语句
我箭头所指的语句段就是我再原来正常构建的基础上添加的用于在指定目录下备份每次jar包的语句,之前利用时间戳备份的注释掉了。后续如果服务器磁盘不够的话,可以在每次构建时删除保留文件夹的个数。
至此,通过Jenkins回滚指定版本号代码已经实现,构建一下看看具体效果。
- 先看服务器运行的jar包的时间和文件时间,
时间是10-18 14:02 - 查看构建历史获取版本号,通过rollback去回滚到指定版本,
这里可以看到sport-api-agent最新一次构建是在10-18 14:01,与文件时间对应,
假设这次更新有问题,那么我们尝试回滚到169这个build_number
- 再次检查服务器运行jar包的时间和文件时间
文件时间和程序启动时间都已变化,和运行rollback构建时间一致,所以回滚成功。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)