阻塞背景
最近一段时间起,项目每次提交后自动部署 jenkins都有概率 超时,但是我看服务器.log日志 其实已经运行了,之前有点忙我就没管了。
问题排查
部署超时,一定是监听项目是否运行的脚本有问题。 因为jenkins本身不具备监听项目部署是否成功,而是通过我们编写的启动脚本 -> *.sh,
正常项目成功 应该返回 exit 0,如果失败 返回 exit 1。
不知道你有没有发现问题,其实直接看 循环监听 这部分就差不多了
while [ -f $LOG_FILE] 如果存在日志文件 则死循环,相当于监听器
if[[ "$success" != "" ]] 如果变量不为空 则进入 ps:这里监听了 Started.....日志关键词 来判断是否启动成功
then 成功走的条件, 直接break,跳出循环结束
else sleep 1s 如果没有找到 成功标识,就等待1秒继续遍历,确保不会太消耗性能
下面的fail 判断也是同理:但是仔细看会发现 echo "项目可能启动失败" 后面竟然 跟了一个 tail -f $LOG_FILE
tail -f *.log 用于实时查看日志,和cat的区别在于 cat只能之前打印出来的,tail -f 是只要日志更新就会一直打印(动态),直到手动ctrl +c 退出
既然知道这里有问题 那就看为什么会进入失败,按道理 正常项目启动时 fail这种关键词 是不应该出现的,通过日志查看发现
原来是之前我看见flowable流程没有用到这几张表就删除了,但是flowable框架 在项目启动前会检查数据库表完整性,因为缺少这张表,他就抛了个异常。
到这里其实就明白为什么部署 像抽奖一样,因为先进入 success时没有立马检查到,休眠1秒后 进入fail的判断,这个时候误打误撞匹配上了,tail -f 一直打印日志 导致进入不到 break,死循环!!!!!!!!!!!!!!!!!!!!!!
总结
项目能运行起来 你就别管为什么能运行 认真😒。其实在这期间 我也学到了.sh的一些语法,比如 java的if else if else 在sh中 就是 if then elif else,而且if 后面要以fi 结尾...... 还有对于.sh退出时 规划应该是 exit 0|1 但是项目中没有这么做, echo 后面随便跟字符串其实 隐式表示 exit 0 所以为什么后面没有写这个 但是jenkins还是会成功