jenkins后处理shell脚本实现java jar启动并打印日志+自动回退+备份

上网找了好多,都不太好用,就结合了一下,自己写了一下。
过程就是启动之前检查原来项目是否正常启动
正常启动则备份,没正常启动则不备份 直接 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
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值