Jenkins Pipline推送构建结果到飞书Robot
先上图,效果如上图。
截至2022年7月,Jenkins插件中心上面都没有飞书相关的插件,只有钉钉的插件。网上未没找到相关推送到飞书群的文章,只好参考钉钉推送相关代码自行实现了。
需要安装插件:Build User Vars
在gitlab中新建自定义共享库,完整路径为
jenkinslibrary/src/org/devops/larkmes.groovy
内容如下:
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++) { if (j > 10) { changeString += "......" break } 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 request_post(endpoint, comment) { println(comment) def url = new URL(endpoint) def url_connection = url.openConnection() url_connection.setRequestMethod("POST") url_connection.setDoOutput(true) url_connection.setRequestProperty("Content-Type", "application/json") url_connection.getOutputStream().write(comment.getBytes("UTF-8")) def response_code = url_connection.getResponseCode() println(response_code) if (response_code != 200) { println("Warning: faled to post message") } else { println("successed to post message") } } def GetSuccessContent() { wrap([$class: 'BuildUser']) { def Content = "" Content = "项目名称:**${env.JOB_NAME}**\\n当前版本:**${env.BUILD_NUMBER}**\\n构建发起:**${env.BUILD_USER}**\\n持续时间:**${currentBuild.durationString}**\\n构建日志:**[点击查看详情](${env.BUILD_URL}console)**\\n构建结果:**构建成功 ✅**" return Content } } def GetFailureContent() { wrap([$class: 'BuildUser']) { def Content = "" Content = "项目名称:**${env.JOB_NAME}**\\n当前版本:**${env.BUILD_NUMBER}**\\n构建发起:**${env.BUILD_USER}**\\n持续时间:**${currentBuild.durationString}**\\n构建日志:**[点击查看详情](${env.BUILD_URL}console)**\\n构建结果:**构建失败 ❌**" return Content } } def GetMsgData(content, color) { def msg_data = """ { "msg_type":"interactive", "card":{ "config":{ "wide_screen_mode": true, "enable_forward": true }, "elements":[ { "tag": "div", "text": { "content": "${content}", "tag": "lark_md" } }, { "tag": "hr" }, { "tag": "div", "text": { "content": "更新记录:\\n${GetChangeString()}", "tag": "lark_md" } } ], "header":{ "template": "${color}", "title":{ "content": "Jenkins构建报告", "tag": "plain_text" } } } } """ return msg_data } def SuccessNotice(wehook) { def content = GetSuccessContent() def msg_data = GetMsgData(content, "green") request_post(wehook, msg_data) } def FailureNotice(wehook) { def content = GetFailureContent() def msg_data = GetMsgData(content, "red") request_post(wehook, msg_data) }
Pipline范例:
@Library('dingtalk')_ def larkmes = new org.devops.larkmes() pipeline { agent any stages { stage('Test False') { steps { sh """ false """ } } } post { success { script { larkmes.SuccessNotice("${env.LARK_WEHOOK}") } } failure { script { larkmes.FailureNotice("${env.LARK_WEHOOK}") } } } }
建议在Jenkins中自定义全局变量,Pipline从Jenkins变量中读取wehook地址,这样就不用在每个Pipline中配置wehook地址了
在Jenkins的设置中设置Library
参考链接:
1、JenkinsShareLibrary实践之自定义通知器
2、Jenkins自定义全局变量,所有pipeline都可以引用
3、Jenkins扩展shared-library进行钉钉消息推送
分类:
运维
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2018-07-08 树莓派(centos7)安装mysql