Jenkins的搭建及应用(四)
Jenkins控制台输出启动日志
Jenkins的搭建需要多很多问题,其中两个问题相对突出,一是Jenkins任务一直停滞不结束问题,这个我是通过输出日志重定向方法处理的。二是Jenkins控制台无法输出Jar启动的日志,本章详细说明这个问题。
问题概述
文章二中的Maven打包日志,Jenkins能正常的输出到自己控制台中,但是文章三中的Jar包启动日志,缺没办法输出控制台,其原因是打包的操作是在22机器上完成的日志输出到22的nohup.out中,而Jar启动的操作实在18机器上,日志输出在18机器的nohup.out中。
解决思路
1.22机器上远程指令tail -f 18机器上的nohup.out
2.存在问题tail -f 的进程不会自己结束,Jenkins任务会卡着不停
3.使用和文章三种相同的思路,查询tail -f的进程号,再杀掉
解决方案
18机器上,在对应的项目路径下建两个脚本,一是日志打印脚本,其核心是tail -f 日志,然后检测是否有成功标志。二是杀日志进程脚本,其核心是检测日志中是否出现成功部署的标示,有就向指定文件中输入特殊值,然后杀掉tail -f的进程,或者超时杀进程。
打印日志脚本
先去执行kill_tailf.sh脚本,然后执行tailf 命令,检测日标文件中是否存在特殊标示,打印本次部署的结果。
# $1为job文件夹部署的位置
# 后台执行杀死
sh $1/kill_tailf.sh $2 &
# 执行tailf 查看日志
echo "执行shell命令: tailf $2/nohup.out"
tailf $2/nohup.out
echo [tags] tailf 命令已经成功退出
# 判断是否捕获到 Started .* second
sum=`cat $2/boole_log`
sum_jvm=`cat $2/boole_jvm_log`
if [ $sum -gt 0 ];then
echo [tags] ------------
echo [tags] 本次部署成功
echo [tags] ------------
elif [ $sum_jvm -gt 0 ];then
echo [tags] ------------
echo [tags] 本次部署成功
echo [tags] ------------
else
echo [tags] ------------
echo [tags] 本次部署失败
echo [tags] ------------
fi
日志Kill脚本
清除两个特殊文件中的值,检测日志文件中是否存在成功标示,有就向指定文件中输出特殊标志,然后找到tailf的进程后杀掉,或者超时后杀掉。
#项目日志文件 nohup.out
des_log=$1/nohup.out
echo "项目日志为:$des_log"
second=0
echo "" > $1/boole_log
echo "" > $1/boole_jvm_log
while true
do
sum=`cat ${des_log} |grep 'Started App in' |wc -l`
sum_jvm=`cat ${des_log} |grep 'JVM running for' |wc -l`
#echo "[tags] sum: ${sum} second: $second sum_jvm: $sum_jvm"
echo "${sum}" >$1/boole_log
echo "${sum_jvm}" >$1/boole_jvm_log
if [ ${second} -ge 46 ];then
echo 部署等待时间过长 退出部署
ps -ef |grep "tailf ${des_log}" |grep -v grep|awk '{print $2}' |xargs kill
break
fi
if [ ${sum} -gt 0 ] || [ ${sum_jvm} -gt 0 ];then
echo "[tags] sum ${sum} "
ps -ef |grep "tailf ${des_log}" |grep -v grep|awk '{print $2}' |xargs kill
echo [tags] 项目启动花费 $second 秒
break
fi
second=$((second + 2))
sleep 2
#echo [tags] 启动时长second $second
done
Jenkins中的调用
执行18机器上的tailf.sh脚本,具体可以看文章三中最后一部分。
ssh root@192.168.***.18 "sh ${TARGET_FATHER_PATH}${TAIL_SH_NAME} ${TARGET_FATHER_PATH} ${TARGET_FILE_PATH}"
本章内容参考了文章 链接.