線上監控使用飛書告警

一、連接飛書
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

最後飛書的通知效果如下: