Jenkins+基础系列13:番外篇--增加jar包启动监控日志,Python脚本

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

猜你喜欢

转载自blog.csdn.net/yangj507/article/details/103101947