jenkins后处理shell脚本实现java jar启动并打印日志+自动回退+备份
#!/bin/bashport=10024backupDate=$(date "+%Y%m%d%H%M%S")backupName=ProjectName$backupDate.tartar -cvf ~/jenkinsDeploy/backUp/tv/$backupName ~/jenkinsDeploy/tv/*rm -r ~/jenkinsDeploy/tv/*cd ~/.jenkins/w
·
上网找了好多,都不太好用,就结合了一下,自己写了一下。
过程就是启动之前检查原来项目是否正常启动
正常启动则备份,没正常启动则不备份 直接 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
亲测好用!
更多推荐
已为社区贡献2条内容
所有评论(0)