一、连接飞书
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
最后飞书的通知效果如下: