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



    前言–实现效果

    通过jenkins插件配置钉钉/企业微信的机器人webhook,我们可以实现自动通知构建结果。但是我们想要在git仓库提交后自动构建,机器人通知可以携带git commit log的信息,实现如下的效果👇
    在这里插入图片描述
    在这里插入图片描述


    一、jenkins内置环境变量的问题

    在调试过程中很多发现很多内置变量的值为空,参考了该博文内置变量说明才知道jenkins的内置变量有的只供邮件配置使用,例如:在邮件插件中调用
    ${CAUSE} 是可行的,但是在其它地方(执行 Shell 或 Python 脚本时),确只能得到 None 值。
    内置变量汇总参考

    调试过程中发现例如${BUILD_ID}的值可以获取到,但是构建结果$BUILD-STATUS的内置变量却无法获取。
    原因①部分内置变量只支持邮件,例如${currentResult}
    ②非默认环境变量你需要查看你的文件,看看是否存在.需要手动配置全局变量。地址如下:http://localhost:8080/env-vars.html/ (需调整地址和端口为你自己的)
    ③有的内置变量需要插件支持才能使用。例如${BUILD_TIMESTAMP} 需要安装Build Timestamp Plugin插件后,才能返回数据。

    在这里插入图片描述

    二、实现方案

    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)’在这里插入图片描述 3. 在你实现jenkins成功通知钉钉后,在构建的Job设置中,勾选✔机器人,高级配置中自定义内容中添加以下内容os.getenv("SCM_CHANGELOG") 获取环境变量。 4. 如果你配置后失败,钉钉通知没用获取到变量而是直接把代码发送,可能有如下几个原因,请你自己排查①是否安装Changelog插件并在工程中配置②如果手动重新构建工程,而不是通过gogs change引起,也就是不存在gogs change log值为空③git 提交时没用commit log ,也就是不存在gogs change log值为空在这里插入图片描述

    2.企业微信通知

    因企业微信插件无法自定义发送内容,因此我实现的方案是在构建后执行python脚本,通过Jenkins-api获取构建结果,自己拼接发送内容:

    1. 在jenkins服务器上安装jenkins-python
    pip3 install python-jenkins
    
    • 1

    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 = '(¬_¬ ) No  Changes 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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    3.在jenkins插件中心安装插件post build task 用于在job构建后执行shell

    SELLCODE="python  /opt/jenkins_notification.py  ${JOB_NAME}  ${BUILD_ID}  "   
    #通过远程ssh执行python脚本(因为我调试时发现jenkins账号环境下执行会找不到库,只能使用我的研发账号环境)
    sshpass -p "****userpassword***" ssh   username@192.168.2.8  $SELLCODE
    
    • 1
    • 2
    • 3

    在这里插入图片描述


    总结

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

  • 相关阅读:
    用CSS实现一个扇形
    【Python】从基础到进阶(一):了解Python语言基础以及变量的相关知识
    计算机毕业设计-基于SSM的学生考勤管理系统
    3.4 这些都是小红书的流量入口【玩赚小红书】
    python图片合成
    使用C++实现MySQL数据库编程
    Qt 堆栈窗体QStackedWidget使用
    小白一键重装官网下载使用方法
    英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构技术和性能对比带你解决疑惑
    云原生|kubernetes|部署MySQL一主多从复制集群
  • 原文地址:https://blog.csdn.net/weixin_39569364/article/details/126340066