前言

在使用Jenkins进行业务构建中,可以使用支持webhook的企业通讯软件进行通知。常见的有飞书 lark 钉钉 企微等。其使用webhook的方式大同小异。

准备

创建机器人

在群中创建webhook机器人。一般来说使用webhook机器人使用一下集中方式来进行简单得安全设置:

  • 来源IP
  • 关键字
  • 密钥

在Jenkins pipeline中实现使用飞书/lark/钉钉等webhook方式发送通知_Jenkins

这里没有所谓绝对的优劣,选择适合自己的方式即可。

测试消息

一般情况都是通过构建一个json,满足安全设置并通过post方式发送到webhook地址既可以实现消息的发送。

message='{"msg_type": "text", "content": {"text": "这是一条通过curl直接构造发送的测试消息 2022-12.12"}}'
curl -H "Content-Type: application/json" -X POST -d "$message" https://open.larksuite.com/open-api/bot/v2/hook/your_webhook_id


pipeline中实现

在pipeline中其实并没有什么特殊的,只是pipeline是groovy语法,在和shell结合的时候需要规避一些容易出现问题的点,比如变量的使用,以及引号的嵌套等。这些可以在上一篇文档中有提到Jenkins的Pipeline中变量的使用

我的目标是构建成功和失败的时候发送不同的信息,为了简化逻辑,在environment中定义两个字符串来定义发送成功与失败的json字符串。


    environment {
        git_url = "${params.git_url}"
        git_branch = "${params.git_branch}"
'
        //定义需要上传的SWR组织名称
        organization = 'test'

        build_name = "${params.build_name}"
        apiserver = 'https://192.168.1.1:5443'
        k8s_namespace = 'test'

        k8s_deployment = "${build_name}"

        currentTime = sh(returnStdout: true, script: 'date +"%m%d%Y %H:%M:%S"').trim()

        msg_success = """
        {
        "msg_type": "post",
        "content":
         {"post": {"zh_cn": {"title": "项目更新通知","content": [[
         {"tag": "text","text": "项目更新通知: ${k8s_namespace} 项目:${k8s_deployment} 分支:${git_branch}分支 发布成功  $currentTime"}
         ]]}}}
        }
        """
        msg_fail = """
        {
        "msg_type": "post",
        "content":
         {"post": {"zh_cn": {"title": "项目更新通知","content": [[
         {"tag": "text","text": "项目更新通知: ${k8s_namespace} 项目:${k8s_deployment} 分支:${git_branch}分支 发布失败  $currentTime"}
         ]]}}}
        }
        """
    }

在post部分,如果构建成功,就是用上文中的msg_success,如果失败就使用msg_fail。

post {
        success {
            echo 'I succeeeded :)'
            script {
                sh """
                    curl -X POST -H "Content-Type: application/json" -d '${env.msg_success}' 'https://open.larksuite.com/open-api/bot/v2/hook/your_webhook_id'
                """
                }
        }
        failure {
            echo 'I failed :('
            script {
                sh """
                    curl -X POST -H "Content-Type: application/json" -d '${env.msg_fail}' 'https://open.larksuite.com/open-api/bot/v2/hook/your_webhook_id'
                """
                }
        }

效果如下:

在Jenkins pipeline中实现使用飞书/lark/钉钉等webhook方式发送通知_Jenkins_02

结语

本文使用lark(飞书国际版)作为验证。其他的基本大同小异。相比较,钉钉在富文本上能实现更多的样式。