赞
踩
上网找了好多,都不太好用,就结合了一下,自己写了一下。
过程就是启动之前检查原来项目是否正常启动
正常启动则备份,没正常启动则不备份 直接 rm-r
然后复制项目到启动目录
然后nohup启动
在日志文件内 监测行数 一个记现在打印到第几行了 一个记日志有多少行了 若不相等,则相减 输出日志那几行
当遇到Started App in 即成功
若启动时间过长或者日志里很明确有错误了,则退出部署,若failedNeedRollBack参数是true
则回退版本,回退版本就是挑选最近的部署项目,解压,启动,监测日志
若回退失败,则不再进行任何操作。值得注意的是 无论成功与否,最终jenkins我都要求他failed
因为本身启动就是失败了。
以前没怎么写过shell脚本,也是不断搜不断写的 很冗杂,有问题请留言。一起学习,谢谢
#!/bin/bash/ # $1 因为这个脚本是好几个服务脚本 所以有个type $2 port $3 failedNeedRollBack(失败是否回退) 这些参数都是jenkins的 参数化构建过程 里面添加的参数 dateToday=$(date +%F) #我的log路径需要 backupDate=$(date "+%Y%m%d%H%M%S") #备份需要 backupName=$1"ProjectName"$backupDate".tar" #备份名称 des_log=~/jenkinsDeploy/$1/logs/xxx/$dateToday/info.0.log #log路径 fileSize=`du -s ~/jenkinsDeploy/$1/` #项目所在路径的大小 # 备份过程 只有检测到日志里面有Started application in才备份 if [[ ${fileSize%%/*} -ne 0 ]]; then if [[ `cat $des_log |grep 'Started application in' |wc -l` -gt 0 ]]; then echo [INFO] ">>>>>>>>>> 开始备份 <<<<<<<<<<" tar -cvf ~/jenkinsDeploy/backUp/$1/$backupName -C/data/xxx/jenkinsDeploy/$1/ . --exclude=logs >/dev/null #排除log 打包项目路径下的内容 并且放入backup路径下 echo [INFO] ">>>>>>>>>> 结束备份 <<<<<<<<<<" fi rm -r ~/jenkinsDeploy/$1/* #删除部署路径下的内容 fi # 将jenkins workspace内的内容放入启动所需目录下 cd ~/.jenkins/workspace/$1"ProjectName"/target cp *.jar ~/jenkinsDeploy/$1 cp -r resources ~/jenkinsDeploy/$1 cp -r lib ~/jenkinsDeploy/$1 cd ~/jenkinsDeploy/$1 jarOldName=`ls -a|grep ProjectName-` jarNewName="jenkins-"$1"-"$jarOldName mv $jarOldName $jarNewName # nohop启动 # 最好不要用端口kill jarNewName名字拼接一下 ps -ux|grep $jarNewName|grep "port="$2|grep -v grep|awk '{print $2}'|xargs kill -9 BUILD_ID=dontKillMe echo [INFO] ">>>>>>>>>> 开始启动项目 <<<<<<<<<<" nohup java -jar -XX:MetaspaceSize=512M -Xmx10g -Dserver.port=$2 -Dspring.profiles.active=test $jarNewName & sleep 2 second=0 lastShellRow=0 echo [INFO] ">>>>>>>>>>> 日志所在位置"$des_log" 开始输出日志<<<<<<<<<<" # 日志监测部分 while true do nowShellRow=`cat $des_log |wc -l` showRow=$[nowShellRow-lastShellRow] if [[ $showRow -ge 0 ]]; then tail -n$showRow $des_log fi sum=`cat $des_log |grep 'Started application in' |wc -l` sum_jvm=`cat $des_log |grep 'JVM running for' |wc -l` failed_sign=`cat $des_log |grep 'Application run failed\|Failed to' |wc -l` if [ $second -ge 800 ];then echo [ERROR] ">>>>>>>>>> 部署等待时间过长 退出部署 <<<<<<<<<<<" ps -ux|grep $jarNewName|grep "port="$2|grep -v grep|awk '{print $2}'|xargs kill -9 if [[ $3 = "true" ]];then echo [INFO] ">>>>>>>>>> 准备回退版本 <<<<<<<<<<" bash ~/jenkinsDeploy/runShell/rollback.sh $1 $2 fi exit 1 break fi if [ $sum -gt 0 ] || [ $sum_jvm -gt 0 ];then echo [INFO] ">>>>>>>>>> 项目启动花费 $second 秒 <<<<<<<<<<" break fi if [[ $failed_sign -gt 0 ]];then echo [INFO] ">>>>>>>>>> 项目启动花费 $second 秒 <<<<<<<<<<" echo [ERROR] ">>>>>>>>>>> 项目启动失败 <<<<<<<<<<<" if [[ $3 = "true" ]];then echo [INFO] ">>>>>>>>>> 准备回退版本 <<<<<<<<<<" bash ~/jenkinsDeploy/runShell/rollback.sh $1 $2 fi exit 1 break fi second=$((second + 2)) lastShellRow=$nowShellRow sleep 2 done
回退shell脚本
#!/bin/bash/ dateToday=$(date +%F) rootPath=/xxx/xxx #只是为了拼备份地址 以及 部署地址 backupPath=$rootPath/jenkinsDeploy/backUp/$1 deployPath=$rootPath/jenkinsDeploy/$1 logPath=$deployPath/logs/xxx/$dateToday/info.0.log #日志地址 # 获取最近的那条备份 tarName=`ls -t $backupPath| head -n1` #获取时间最近的那条备份的名称 echo [INFO] ">>>>>>>>> 获取"$backupPath$tarName"进行版本回退操作 <<<<<<<<<<" cd $deployPath jarName=`ls -a|grep ProjectName-` # $1 logPath $2 port $3 jarName monitorStartUpLogsFile(){ lastShellRow=0 while true do nowShellRow=`cat $1 |wc -l` showRow=$[nowShellRow-lastShellRow] if [[ $showRow -ge 0 ]]; then tail -n$showRow $1 fi sum=`cat $1 |grep 'Started App in' |wc -l` sum_jvm=`cat $1 |grep 'JVM running for' |wc -l` failed_sign=`cat $1 |grep 'Application run failed\|Failed to' |wc -l` if [ $second -ge 800 ];then echo [ERROR] ">>>>>>>>>> 回退版本项目部署等待时间过长 退出部署 <<<<<<<<<<" ps -ux|grep $3|grep "port="$2|grep -v grep|awk '{print $2}'|xargs kill -9 exit 1 break fi if [ $sum -gt 0 ] || [ $sum_jvm -gt 0 ];then echo [INFO] ">>>>>>>>>> 项目回退版本启动花费 $second 秒 <<<<<<<<<<" echo [INFO] ">>>>>>>>>> 项目回退版本启动成功 <<<<<<<<<<" break fi if [[ $failed_sign -gt 0 ]];then echo [INFO] ">>>>>>>>>> 项目回退版本启动花费 $second 秒 <<<<<<<<<<" echo [ERROR] ">>>>>>>>>> 项目回退版本启动失败 <<<<<<<<<<" echo [INFO] ">>>>>>>>>> 请手动操作回退版本!<<<<<<<<<<" exit 1 break fi second=$((second + 2)) lastShellRow=$nowShellRow sleep 2 done } if [[ -n "$tarName" ]]; then # 非空 恢复备份 rm -r $deployPath/* echo [INFO] ">>>>>>>>>> 开始解压备份版本 <<<<<<<<<<" tar -xvf $backupPath/$tarName -C $deployPath/ > /dev/null echo [INFO] ">>>>>>>>>> 备份版本解压完成 <<<<<<<<<<" cd $deployPath ps -ux|grep $jarName|grep "port="$2|grep -v grep|awk '{print $2}'|xargs kill -9 BUILD_ID=dontKillMe echo [INFO] ">>>>>>>>>> 开始启动回退的版本"[$tarName]" <<<<<<<<<<" nohup java -jar -XX:MetaspaceSize=128M -Xmx10g -Dserver.port=$2 -Dspring.profiles.active=test $jarName & monitorStartUpLogsFile $logPath $port $jarName fi
亲测好用!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。