實現Gitlab
事件自動觸發Jenkins
構建及釘釘訊息推送
實踐環境
GitLab Community Edition
12.6.4
Jenkins
2.284
Post build task
1.9(Jenkins
外掛)
Generic Webhook Trigger Plugin
1.72(Jenkins
外掛)
GitLab
1.5.13(Jenkins
外掛)
實現步驟
釘釘機器人配置
選擇要推送的釘釘群 -> 點選群設定按鈕 -> 點選智慧群助手 -> 點選新增機器人 -> 點選新增機器人+號按鈕 -> 點選自定義->填寫機器人名字,用於匹配推送訊息請求體內容的的關鍵詞
然後,複製出Webhook
地址,供下文釘釘訊息推送Shell
指令碼中使用,完成
安裝Jenkins外掛
新建並配置Jenkins專案
Build Triggers配置
如下,勾選Generic Webhook Trigger
Post content parameters
(因為Gitlab
觸發的請求為post
請求,需要基於請求體內容來判斷是否執行Jenkins
構建)關鍵配置項說明:
Variable
自定義變數名稱
Expression
用於提取變數值的表示式(支援JSONPath
、XPath
),提取的值賦值給上述自定義變數(例中為event_name
)。
Option Filter
關鍵配置項說明:
Expression
用於匹配下述Text
的正規表示式,如果匹配則執行構建請求,否則不執行。這裡配置為^push$
,是因為Gitlab
merge
合併程式碼操作觸發的請求,其請求體為json
格式資料,其中包含名為event_name
的鍵,其值為 push
Text
用於匹配上述正規表示式的文字,例中設定為自定義變數$event_name
。
以上配置大意為,如果收到構建請求,使用JSONPath
表示式從JSON
格式的請求體獲取鍵為event_name
的值,儲存到名為event_name
變數,然後取該變數值同正規表示式^push$
匹配,如果匹配,則觸發Jenkins
構建當前專案,否則不構建。
Token:自定義token值,用於請求http://JENKINS_URL/generic-webhook-trigger/invoke
觸發構建使用,如下,可以用於查詢引數、請求頭引數
/invoke?token=TOKEN_HERE
token: TOKEN_HERE
Authorization: Bearer TOKEN_HERE
generic-webhook-trigger
配置參考連線
https://plugins.jenkins.io/generic-webhook-trigger/
Post-build Actions
配置
點選Add post-build action
按鈕,彈出介面中選擇Post build task
可新增以下配置介面。如下,可在Script
輸入框中編寫構建完成後需要執行的Shell命令(該外掛會先根據填寫的shell
命令生成一個臨時sh指令碼,然後執行該指令碼),例中為釘釘推送命令,具體程式碼參見下文
如上圖,如果只希望構建成功才執行Script
,可以勾選Run script only if all previous steps were successful
釘釘訊息推送Shell
#!/bin/bash
#################################################################
# 作者:shouke
# 日期:2021-03-07
# 作用:機器人通知
#################################################################
# 釘釘訊息變數定義
#################################################################
# 當前時間
TIME_NOW=`date "+%Y年%m月%d日 %H:%M:%S"`
BUILD_STATUS="失敗"
LAST_BUILD_BUILD_XML=`curl http://ops.dev.xxxx.com/view/testarch/job/$JOB_NAME/lastBuild/api/xml --user juser_name:123456`
BUILD_RESULT=$(echo $LAST_BUILD_BUILD_XML | grep "<result>SUCCESS</result>")
if [ "${BUILD_RESULT}" ];then
BUILD_STATUS="成功"
else
BUILD_RESULT=$(echo $LAST_BUILD_BUILD_XML | grep "<result>FAILURE</result>")
if [ "${BUILD_RESULT}" ];then
BUILD_STATUS="失敗"
else
BUILD_STATUS="無法獲取"
fi
fi
# 機器人 webhook 地址(上文新增釘釘機器人結束時複製的webhook地址)
DINGTALK_WEBHOOK_URL='https://oapi.dingtalk.com/robot/send?access_token=903fcd6c56f301d0a57bee243792a11bb1e42cae89af5a9071bdba890c0a3d2'
# 訊息標題 # 實際不起作用,但是不能少,否則傳送失敗
DINGTALK_TITLE="XX平臺有新的構建,請及時查閱"
# 訊息正文
# Jenkins Job構建日誌地址
JENKINS_JOB_BUILD_LOG_URL="http://ops.dev.xxxx.com/view/testarch/job/${JOB_NAME}/${BUILD_NUMBER}/console"
DINGTALK_TEXT="## xx平臺有新的構建,請及時查閱\n\n>\
**【通知時間】**:${TIME_NOW}\n\n>\
**【構建ID】**:${BUILD_DISPLAY_NAME}\n\n>\
**【構建專案】**:${JOB_NAME}\n\n>\
**【構建狀態】**:${BUILD_STATUS}\n\n>\
**[點選檢視更多](${JENKINS_JOB_BUILD_LOG_URL})**\n
"
#
# 傳送釘釘訊息通知函式
#################################################################
function SEND_MESSAGE_TO_DINGTALK() {
/usr/bin/curl "$1" -H 'Content-Type: application/json' -d "
{
\"markdown\": {
\"title\": \"$2\",
\"text\": \"$3\"
},
\"at\": {
\"atMobiles\": [],
\"isAtAll\": false
},
\"msgtype\": \"markdown\"
}
"
}
# 傳送釘釘訊息
#################################################################
SEND_MESSAGE_TO_DINGTALK "${DINGTALK_WEBHOOK_URL}" "${DINGTALK_TITLE}" "${DINGTALK_TEXT}"
說明:
curl http://ops.dev.xxxx.com/view/testarch/job/$JOB_NAME/lastBuild/api/xml --user juser_name:123456`
以名為juser_name
的使用者,使用密碼123456訪問指定專案的最後一次構建相關的資訊,返回xml文件
注意:釘釘聊天視窗中要實現訊息換行必須使用兩個\n
Gitlab
自動觸發配置
Settings
-> Integration
,開啟如下頁面,
1)填寫URL(http://ops.dev.xxxx.com/generic-webhook-trigger/invoke?token=0771826b93bbd566266bce34f5123ebb
),這裡的token
值即為generic-webhook-trigger
外掛中配置在定義token
值
2)勾選Push events
觸發器(這裡以push、合併程式碼操作為例子,所以僅勾選該事件)
3)勾選 Enable SSL verification
核取方塊(如果沒有勾選的話,預設就是勾選的)
最後點選 Add webhook
按鈕
新增的配置,會自動顯示在下方,可以對其進行事件觸發測試
觸發的記錄會自動在配置編輯頁面下方顯示,點選 View details
按鈕,可以檢視請求明細
注意:自動觸發時Jenkins
專案構建時,如果Jenkins
使用了引數化構建外掛Build With Parameters Plugin
,並且使用外掛實現的引數有設定預設值,則自動觸發時也會自動使用對應引數的預設值進行構建。