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进行钉钉消息推送

posted @ 2022-07-08 17:09  sherlock-merlin  阅读(1747)  评论(2编辑  收藏  举报