后端|【python】Jenkins实现携带commit_log钉钉/企微机器人通知


Jenkins实现携带commit_log钉钉/企微机器人通知

  • 前言--实现效果
  • 一、jenkins内置环境变量的问题
  • 二、实现方案
    • 1.钉钉通知+git commit log
    • 2.企业微信通知
  • 总结

前言–实现效果 通过jenkins插件配置钉钉/企业微信的机器人webhook,我们可以实现自动通知构建结果。但是我们想要在git仓库提交后自动构建,机器人通知可以携带git commit log的信息,实现如下的效果
后端|【python】Jenkins实现携带commit_log钉钉/企微机器人通知
文章图片

后端|【python】Jenkins实现携带commit_log钉钉/企微机器人通知
文章图片

一、jenkins内置环境变量的问题
在调试过程中很多发现很多内置变量的值为空,参考了该博文内置变量说明才知道jenkins的内置变量有的只供邮件配置使用,例如:在邮件插件中调用
${CAUSE} 是可行的,但是在其它地方(执行 Shell 或 Python 脚本时),确只能得到 None 值。
内置变量汇总参考
调试过程中发现例如${BUILD_ID}的值可以获取到,但是构建结果$BUILD-STATUS的内置变量却无法获取。
原因①部分内置变量只支持邮件,例如${currentResult}
②非默认环境变量你需要查看你的文件,看看是否存在.需要手动配置全局变量。地址如下:http://localhost:8080/env-vars.html/ (需调整地址和端口为你自己的)
③有的内置变量需要插件支持才能使用。例如${BUILD_TIMESTAMP} 需要安装Build Timestamp Plugin插件后,才能返回数据。
后端|【python】Jenkins实现携带commit_log钉钉/企微机器人通知
文章图片

二、实现方案 1.钉钉通知+git commit log 利用钉钉通知插件+Git Changelog插件实现。
  1. Jenkins插件管理安装钉钉通知插件及changelog插件,并配置。具体配置看这个
    在系统配置中,设置你的钉钉机器人webhook和加密验证字符,然后要在工程配置中设置changelog,构建环境中把Add changelog打勾?设置字符格式
    Entry Format:%3$s (at %4$s via %1$s)\n
    Date Format:yyyy-MM-dd HH:mm:ss
    当获取到changelog的值SCM_CHANGELOG示例 ‘commit log 通知测试(at 2022-08-15 09:39:16 via mike_chen)’后端|【python】Jenkins实现携带commit_log钉钉/企微机器人通知
    文章图片
    3. 在你实现jenkins成功通知钉钉后,在构建的Job设置中,勾选?机器人,高级配置中自定义内容中添加以下内容os.getenv("SCM_CHANGELOG") 获取环境变量。 4. 如果你配置后失败,钉钉通知没用获取到变量而是直接把代码发送,可能有如下几个原因,请你自己排查①是否安装Changelog插件并在工程中配置②如果手动重新构建工程,而不是通过gogs change引起,也就是不存在gogs change log值为空③git 提交时没用commit log ,也就是不存在gogs change log值为空后端|【python】Jenkins实现携带commit_log钉钉/企微机器人通知
    文章图片
2.企业微信通知 【后端|【python】Jenkins实现携带commit_log钉钉/企微机器人通知】因企业微信插件无法自定义发送内容,因此我实现的方案是在构建后执行python脚本,通过Jenkins-api获取构建结果,自己拼接发送内容:
  1. 在jenkins服务器上安装jenkins-python
pip3 install python-jenkins

2.完整的python脚本代码如下:你可以先在本地调试推送成功后,放到服务器上
import jenkins,json,requests import sys,os#----构建job成功后传入的参数-----# JOB_NAME=sys.argv[1] BUILD_NUMBER=sys.argv[2] #----调试时,直接定义参数-----# # JOB_NAME ='heitouyi' # BUILD_NUMBER='122'#----企业微信机器人的webhook,请改成你的自己的webhook-----# web_hook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的机器人webhook"#----通过http访问你的jenkins log数据----# server1 = jenkins.Jenkins(url="http://192.168.2.8:8080", username='*******', password="password*******") build_info = server1.get_build_info(JOB_NAME, int(BUILD_NUMBER)) # dict字典转json数据 build_info_json = json.dumps(build_info) # 把json字符串转json对象 build_info_jsonobj = json.loads(build_info_json) # print(build_info_jsonobj) BUILD_STATUS =server1.get_build_info(JOB_NAME, int(BUILD_NUMBER))['result'] duration =server1.get_build_info(JOB_NAME, int(BUILD_NUMBER))['duration'] DETAIL_LINK="https://jenkins.icheer.cn/job/"+JOB_NAME+"/"+BUILD_NUMBER # print("-----------------------") changeSET = server1.get_build_info(JOB_NAME, int(BUILD_NUMBER))['changeSet']['items'] COMMIT_USER= "anonymous" if len(changeSET)==0: SCM_CHANGELOG = '(?_? ) NoChanges Log' else: SCM_CHANGELOG=changeSET[0]['msg'] +"" +changeSET[0]['date'] COMMIT_USER=changeSET[0]['author']['fullName'] # print(SCM_CHANGELOG) # 判断日志内容def buildNotification(): if BUILD_STATUS=="SUCCESS": FONT_COLOR="" else: FONT_COLOR="" content = "部署任务:"+"[**"+JOB_NAME+"**]("+DETAIL_LINK+")\n" +FONT_COLOR+BUILD_STATUS+"[]("+DETAIL_LINK+")"+"\n"+ \ ">构建ID:["+str(BUILD_NUMBER)+"]("+DETAIL_LINK+")\n"+ \ ">提交者:" +COMMIT_USER+"\n"+ \ ">提交信息:"+SCM_CHANGELOG+""print(content) #web_hook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=7398f704-1935-4eb1-ab31-ac564923b080" res = requests.post( url=web_hook_url, json={ "msgtype": "markdown", "markdown": { "content": content } } ) res.close()if __name__ == "__main__": buildNotification()

3.在jenkins插件中心安装插件post build task 用于在job构建后执行shell
SELLCODE="python/opt/jenkins_notification.py${JOB_NAME}${BUILD_ID}" #通过远程ssh执行python脚本(因为我调试时发现jenkins账号环境下执行会找不到库,只能使用我的研发账号环境) sshpass -p "****userpassword***" sshusername@192.168.2.8$SELLCODE

后端|【python】Jenkins实现携带commit_log钉钉/企微机器人通知
文章图片

总结 钉钉及企微机器人webHook还是十分方便的,enjoy!

    推荐阅读