1、起因:
在公司Jenkins也用了小半年,遇到一个情况,jar包项目构建成功了,也发了钉钉消息,但实际上,项目没有启动成功。
也就是:构建成功,不等于服务启动成功
2、过程:
自己使用的python编程语言,为了结合后面的接口测试脚本,需要判断服务是否启动成功,启动成功则执行测试脚本,反之不执行
3、使用工具:
Python3.x 简单集成到Jenkins job 构建后的操作步骤中
4、代码很简单,有优化的地方还请指,我可以继续优化
# -*- coding:UTF-8 -*-
# /usr/bin/python3
import subprocess
import sys
def monitor_log(log_file):
po_pen = subprocess.Popen('tail -f ' + log_file,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True,
encoding='UTF-8')
pid = po_pen.pid
print('po_pen.pid:' + str(pid))
while True:
line = po_pen.stdout.readline().strip()
# 判断内容是否为空
if line:
print(line)
if 'Started' in line and 'seconds (JVM running for' in line:
print('启动成功')
sys.exit(0)
elif 'Exception' in line[:50]:
print('启动失败,有报错')
sys.exit(1)
if __name__ == '__main__':
monitor_log(sys.argv[1])
5、集成方式
在构建后操作,SSH Publishers 中直接添加执行脚本,注意脚本是放在目标服务器指定目录的
python3 3.x运行环境
中间的是py脚本的绝对路径
最后是需要监控的日志绝对路径
6、原理过程【重要】
首先咱们看看代码,因为是监控log,就不能用普通的open方式打开文件,log肯定会特别的大
这里使用的subprocess模块进行的操作
然后判断每一行的字段内容(代码中的判断字符串还需要优化,特别是启动失败的判断)
在和Jenkins集成时,一个关键的问题,如何让Jenkins捕获到py脚本中的成功和失败,在查阅了很多资料后终于知道了
(菜是原罪·楼主)
Jenkins如何判断成功还是失败
然后看看平常我们执行python程序最后都会输出一段内容,code 0 代码程序正常退出
最后,我们看看sys这个模块的某功能,最关键的地方在这里,如果我代码里面判断启动成功,我就sys.exit(0) 反之 1
最最后,在Jenkins上进行实践
成功的状态:
失败的状态
配合钉钉群通知
最终完美解决 启动日志监控
sys.argv 大家可以研究下,卖个关子
2020/1/15日更新:已增加了一些启动异常的信息捕获(略显笨拙)
# -*- coding:UTF-8 -*-
# /usr/bin/python3
import subprocess
import sys
def monitor_log(log_file):
po_pen = subprocess.Popen('tail -f ' + log_file,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True,
encoding='UTF-8')
pid = po_pen.pid
print('po_pen.pid:' + str(pid))
while True:
line = po_pen.stdout.readline().strip()
# 判断内容是否为空
if line:
print(line)
if 'Started' in line and 'seconds (JVM running for' in line:
print('启动成功')
po_pen.kill()
sys.exit(0)
elif 'Application run failed' in line and 'ERROR' in line:
print('启动失败,有报错')
po_pen.kill()
sys.exit(1)
elif 'Exception' in line and 'Error' in line:
print('启动失败,有报错')
po_pen.kill()
sys.exit(1)
elif 'ERROR' in line and 'Exception' in line:
print('启动失败,有报错')
po_pen.kill()
sys.exit(1)
elif 'ERROR' in line and 'Migration of schema' in line and 'failed' in line:
print('启动失败,有报错')
po_pen.kill()
sys.exit(1)
else:
continue
if __name__ == '__main__':
monitor_log(sys.argv[1])
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=klkypps11wnj