使用Jenkins擴展共享庫進行釘釘消息推送

起因:執(zhí)行完流水線后進行一定程度的消息推送,所以選擇釘釘進行jenkins構建結構的消息推送

下載配置相關依賴插件
相關環(huán)境:
Jenkins2.277.3,安裝文檔見上篇DingTalk插件 2.4.3build user vars plugin插件 1.7
在Jenkins中安裝釘釘插件DingTalk
“:warning: 請確保你的 Jenkins 版本 >= 2.176.4
釘釘機器人配置,說明文檔
找到 Jenkins 首頁 >> 系統(tǒng)管理 >> 釘釘,我的配置如下圖

“:warning: 注意手動輸入機器人的id,不要自動生成,否則重啟后,robot的id將發(fā)生變化
安裝build user vars plugin插件,插件可能有相關版本依賴,需要重啟一下 Jenkins 才能繼續(xù)安裝
在流水線中,使用wrap,獲取BUILD_USER變量
wrap([$class: 'BuildUser']) {
}
創(chuàng)建配置共享庫
編寫Groovy腳本
項目目錄結構如下:
$ tree jenkinslibrary
jenkinslibrary
├── README.md
└── src
└── org
└── devops
└── dingmes.groovy
3 directories, 2 files
dingme.groovy文件內(nèi)容如下
package org.devops
def GetChangeString() {
MAX_MSG_LEN = 100
def changeString = ""
def changeLogSets = currentBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
def entries = changeLogSets[i].items
for (int j = 0; j < entries.length; j++) {
def entry = entries[j]
truncated_msg = entry.msg.take(MAX_MSG_LEN)
commitTime = new Date(entry.timestamp).format("yyyy-MM-dd HH:mm:ss")
changeString += "> - ${truncated_msg} [${entry.author} ${commitTime}]\n"
}
}
if (!changeString) {
changeString = "> - No new changes"
}
return changeString
}
def DingdingReq(RobotID, Status) {
wrap([$class: 'BuildUser']) {
def changeString = GetChangeString()
dingtalk (
robot: RobotID,
type: 'MARKDOWN',
title: '你有新的消息,請注意查收',
text: [
"### 構建信息",
"> - 應用名稱:**${env.JOB_NAME}**",
"> - 構建結果:**${Status}**",
"> - 當前版本:**${env.BUILD_NUMBER}**",
"> - 構建發(fā)起:**${env.BUILD_USER}**",
"> - 持續(xù)時間:**${currentBuild.durationString}**",
"> - 構建日志:[點擊查看詳情](${env.BUILD_URL}console)",
"### 更新記錄:",
"${changeString}"
],
at: [
'xxxxxxxxxxx'
]
)
}
}
“文本中
xxxxxxxxxxx請根據(jù)實際情況更換為釘釘群組里面,具體人的手機號,可以添加多個
在 Jenkins 中配置將共享庫
找到 Jenkins 首頁 >> 系統(tǒng)管理 >> Global Pipeline Libraries,我的配置如下圖

在流水線中導入共享庫
導入方法@Library('pipeline-library-demo')_,這樣就可以使用共享庫中的代碼了
具體的 pipeline 腳本如下:
#!groovy
@Library('pipeline-library-demo')_
//func from shareibrary
def dingmes = new org.devops.dingmes()
//env
String branchName = "master"
String gitlabCredentialsId = "xxx"
String gitUrl = "http://xxx/xxx/jenkinslibrary.git"
String robotId = "2e0e11c4-2211-4687-b317-cacf58197288"
pipeline {
agent any
stages {
stage('Git Clone') {
steps {
git branch: "${branchName}",
credentialsId: "${gitlabCredentialsId}",
url: "${gitUrl}"
}
}
}
post {
success {
script {
dingmes.DingdingReq(robotId, "構建成功 ?")
}
}
failure {
script {
dingmes.DingdingReq(robotId, "構建失敗 ?")
}
}
}
}
至此完成,構建效果如下圖:

遇到的問題
currentBuild.durationString的值傳遞不進去,一開始先用withEnv包裹一下
后來找到原因 Groovy 在單引號的字符串里面是不支持插值的,所以要用雙引號
單引號中的env.JOB_NAME會引用失敗,雙引號則引用成功
單、雙引號引用JOB_NAME都引用成功
“推薦所有變量都用""雙引號
三引號也是一樣,''' 三單引號不支持插值,"""三雙引號支持插值
參考鏈接:https://www.ssgeek.com/post/jenkinssharelibrary-shi-jian-zhi-zi-ding-yi-tong-zhi-qi/
![]()

點擊下方“閱讀原文”查看更多
評論
圖片
表情
