线上监控使用飞书告警

一、连接飞书
1. 在飞书群中添加自定义机器人





2. Python发送通知的脚本
在部署Jenkins的服务器上创建一个目录,名称随意,将你的webhook地址拷贝到脚本中的url。
从jenkins的内置变量中找出你需要的,在任务的设置中通过命令将变量传给脚本,脚本将变量处理后再通过webhook接口传给飞书。
Jenkins的内置变量可以如下图查看

python脚本如下:

点击查看代码
 
#!/usr/bin/env python
#-*- encoding:utf-8 -*-
 
import sys
 
import requests
 
import time
 
JOB_URL = sys.argv[1]
JOB_NAME = sys.argv[2]
BUILD_NUMBER = sys.argv[3]
GIT_BRANCH= sys.argv[4]
currenttime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
url = '你的webhook地址'
method = 'post'
headers = {
    'Content-Type': 'application/json'
}
json = {
    "msg_type": "interactive",
    "card": {
        "config": {
            "wide_screen_mode": True,
            "enable_forward": True
        },
        "elements": [{
            "tag": "div",
            "text": {
                "content": "项目名称:" + JOB_NAME + "\n构建编号:第" + BUILD_NUMBER + "次构建\n运行时间:" + currenttime + "\n分支:" + GIT_BRANCH,
                "tag": "lark_md"
            }
        }, {
            "actions": [{
                "tag": "button",
                "text": {
                    "content": "查看报告",
                    "tag": "lark_md"
                },
                "url": JOB_URL,
                "type": "default",
                "value": {}
            }],
            "tag": "action"
        }],
        "header": {
            "title": {
                "content": JOB_NAME + " 构建报告",
                "tag": "plain_text"
            }
        }
    }
}
requests.request(method=method, url=url, headers=headers, json=json)

3. Jenkins项目中添加配置
jenkins任务的配置命令如下:

构建完成后,飞书中收到的消息如下:

二、校验用例执行结果,有条件地触发告警
现在jenkins每次构建结束,无论结果如何都会触发发送飞书消息,不符合真正的告警要求,需要判断构建结果中失败用例的数量,有条件的触发告警,尝试了两个思路解决该问题
1、看系统变量中是否有用例执行结果
按照文章第一部分所示的方法,查了一下系统变量,并没有可用的变量。之前配置过jenkins的邮件发送,可以在邮件模板中使用这个变量${TEST_COUNTS},后经查询,这个变量不属于系统变量,应该是邮件插件自带的,这个变量可以在插件Editable Email Notification中找到,但是只能用于邮件的配置中



2、使用linux命令,直接在testng的结果文件中查找
先进到testng结果文件所在的目录下,然后使用grep命令在结果文检查查询关键字“FAIL”的个数,最后使用if语句根据个数判断是否要执行python脚本

点击查看代码
cd /var/lib/jenkins/workspace/MiniProgram-OnlineMonitor/target/surefire-reports
count=$(grep -c "FAIL" testng-results.xml)
if (($count>0))
then
	python /var/lib/jenkins/action.py $JOB_URL $JOB_NAME $BUILD_NUMBER $GIT_BRANCH
else
	exit 0
fi

三、飞书消息体优化-消息中展示失败用例名
上述使用grep查询FAIL关键字个数,实际上结果返回的是符合条件的行数,如果是返回行的内容,可以看到其中就包含了用例名,通过linux的文本处理命令即可截取到用例名,常用的文本处理命令就是著名的三剑客grep,awk,sed,比较复杂,想完全掌握短时间内很难,最后东拼西凑勉强达到了目的
cat testng-results.xml | grep 'FAIL' | awk '{print $6}' | awk -F'"' '{print $2}' | sed ':t;N;s/\n/,/;b t'
第一个awk截取后结果如下
name="selectContactsInfoListTest"
name="spuDetailTest"
name="spuDetailTest"
name="listSpu"
name="listSpuTest"
name="skuSessionInfo"

第二个awk以双引号为分隔符,再截取第二列,结果如下
selectContactsInfoListTest
spuDetailTest
spuDetailTest
listSpu
listSpuTest
skuSessionInfo

最后的sed命令将换行符替换为逗号,结果如下
selectContactsInfoListTest,spuDetailTest,spuDetailTest,skuSessionInfo,listSpu,listSpuTest

再将这个字符串通过命令、脚本传给飞书,即可展示在飞书消息体中,完整命令行如下

点击查看代码
mvn clean test -Dsurefire.suiteXmlFiles="TestSet/testng-pro.xml" -Ppro || true
cd /var/lib/jenkins/workspace/MiniProgram-OnlineMonitor/target/surefire-reports
count=$(grep -c "FAIL" testng-results.xml)
failed_case=$(cat testng-results.xml | grep 'FAIL' | awk '{print $6}' | awk -F'"' '{print $2}' | sed ':t;N;s/\n/,/;b t') 
if (($count>0))
then
	python /var/lib/jenkins/action.py $JOB_URL $JOB_NAME $BUILD_NUMBER $GIT_BRANCH $failed_case
else
	exit 0
fi

最后飞书的通知效果如下:

posted @ 2022-09-01 16:39  TechFans  阅读(922)  评论(0编辑  收藏  举报