Jenkins构建通知

Posted 日行一善

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jenkins构建通知相关的知识,希望对你有一定的参考价值。

一.简介

类似于监控报警,jenkins在配置持续集成后,job的执行将自动化,这就需要每次将构建结果通知到不同载体中进行查看。

像我所在的项目中,可能时不时就发布一个test环境版本,这时候对于测试人员是不友好的,页面正在进行点击测试,突然就没反应了,正在发版中。

就需要微信/钉钉等方式进行通知,不仅告诉开发也告诉测试和运维,当前有版本正在发布。

二.推送到gitlab

当Jenkins执行完构建后,我们还可以将构建结果推送到Gitlab的相应commit记录上,这样就可以将构建状态与commit关联起来。

1.进入Jenkins-》Configure System页,找到“Gitlab”选项,填入Gitlab地址。注意“Connection name”的值,后面会使用到

2.在Credentials下拉列表中选择"GitLab API token"后,单击"Test Connection"按钮,如果返回Success,就说明集成成功了

3.在pipeline的post部分,将构建结果更新到GitLab的相应commit记录上。除此之外,还需要在options部分加入gitLab Connection配置,同时传入"gitlab”参数。"gitlab” 就是上文中提醒读者注意的"Connection name”的值。

pipeline {
    agent any
    triggers {
        gitlab(triggerOnPush: true, triggerOnMergeRequest: true, branchFilterType:\'All\',
        secretToken: "abcdefghijk1mnopqrstuvwxyz0123456789ABCDEF")
    }
    stages {
        stage(\'build\') {
            steps {
                echo "hello world from gitlab trigger"
            }
        }
        post {
            failure {
                updateGitlabCommitStatus name: \'build\', state: \'failed\'
            }
            success {
                updateGitlabCommitStatus name:\'build\', state: \'success\'
            }
        }
        options {
            gitLabConnection( \'gitlab\')
        }
    }
}

需要手动触发一次构建,pipeline才会生效。当前做了一次成功构建、一次失败构建的实验,在Gitlab上项目的commit列表中,显示了最近两次commit的构建状态

三.邮件通知

自带配置

我们使用163邮箱来演示如何在pipeline中加入邮件通知。

步骤如下:
1.进入Manage Jenkins→Configure System→Jenkins Location设置页面,设置管理员邮箱

提示:这一步是必不可少的;否则,在发送邮件通知时会报出"com.sun.mail.smtp.SM TPSend-FailedException : 553 Mail frommust equal authorized user”错误

2.在同一个页面中找到E-mail Notification部分

勾选“Test configuration by sending test e-mail”复选框,输入接收测试邮件的邮箱,然后单击“Test configuration”按钮,

如果提示“Email was successfully sent”,就说明配置成功。

3.在Jenkins pipeline的post部分加入mail步骤。
mail步骤的关键参数介绍如下∶

  • subject,邮件主题。
  • to,收件地址
  • body,邮件内容
  • from,发件地址

欲了解更多参数,可以到官方文档中查看

Email Extension

mailer插件提供的功能过于简单。Email Extension插件对mailer插件进行了扩展,支持更多的特性。

  • 可以定制接收人的邮件列表。
  • 可以将构建日志以附件形式加到邮件中,还可以设置对日志进行压缩。
  • 可以发送附件

具体使用步骤如下:
1.安装Email Extension插件

2.进入Manage Jenkins→Configure System→Extended E-mailNotification配置页面

在Jenkinsfile中使用emailext步骤,因此只要配置SMTP server ,其他选项配置保持默认配置就可以了。

3.将emailext步骤加入pipeline的post部分的failure块内。

post {
    failure {
        emailext body:
            """<p>EXECUTED: Job <b>\\ \'${env. 0B_NAME}:${env.BUILD_NUMBER})\\ \'
            </b></p><p>View console output at "<a href="${env.BUILD_URL}">
            ${env.JOB_NAME}:${env.BUILD_NUMBER}</a>"</p>
            <p><i>(Build log is attached .)</i></p>""",
            compressLog: true,
            attachLog: true,
            recipientProviders: [culprits(), developers(),requestor(), brokenBuildSuspects()],
            replyTo: \'do-not-reply@company.com\',
            subject: "Status: ${currentBuild.result?: \'SUCCESS\'} - Job \\ \'${env. 0B_NANE}: ${env.BUILD_NUMBER}\\\'",
            to: "jenkinsbooksample@163.com"
    }
}

收到邮件

emailext步骤的常用参数介绍如下∶

  • subject : String类型,邮件主题。
  • body : String类型,邮件内容。
  • attachLog (可选):Bool类型,是否将构建日志以附件形式发送。
  • attachmentsPattern (可选) : String类型,需要发送的附件的路径,Ant风格路径表达式。
  • compressLog (可选):Bool类型,是否压缩日志。from(可选) : String类型,收件人邮箱。
  • to (可选) : String类型,发件人邮箱。
  • recipientProviders (可选): List类型,收件人列表类型。replyTo (可选):回复邮箱。

常用的收件人列表类型

提示:requestor ()会读取登录用户的邮箱(在个人资料设置页可以设置)。

关于完整的收件人列表类型,可以参考官方文档

四.钉钉通知

钉钉(DingTalk )是阿里巴巴集团开发的企业协同办公软件。本节介绍Jenkins与钉钉的集成。原理很简单,就是在钉钉群中增加一个钉钉机器人,我们将消息发送到钉钉机器人的API就可以了。

具体步骤如下:
1.配置钉钉机器人,在钉钉群的右上角单击机器人形状的图标

在弹出的机器人类型列表中,选择“Custom”(自定义)类型

按照钉钉的提示操作到达最后一步,复制webhook的URL中的accessToken的值,后面的步骤会使用到

2.安装DingTask插件

3.在Jenkinsfile中加入dingTalk步骤

dingTalk accessToken: "<accessToken值>", imageUrl: "<钉钉群里显示消息的缩略图>",jenkinsUrl:\'<Jenkins的链接>\',message: \'<文本消息>\', notifyPeople: \'张三\'

最后效果如图

注意:如果accessToken的值不对,dingTalk并不会报错。另外,应该使用凭证管理accessToken的值,而不是明文写在Jenkinsfile中

五.脚本钉钉通知

因为插件使用报错,就自己写了脚本达到同样效果

1.创建钉钉群,管理界面添加机器人

2.选择自定义方式

3.复制好webhook

4.选择关键字,这里配置后,消息里有发布这个词才能生效

5.在jenkins服务器上配置脚本/jen_script/dingding.py,这里钉钉用markdown语法写内容

#!/usr/local/python-3.6/bin/python3.6
import json,requests,sys,time,datetime

#[工程名、分支号、是否成功、编号]
job = sys.argv[1]
branch = sys.argv[2]
stat = sys.argv[3]
bianhao = sys.argv[4]

if int(stat) == 0:
    name = \'发布成功!\'
    tupian = \'![file](https://prod-private.oss-cn-beijing.aliyuncs.com/yw/QQ%E6%88%AA%E5%9B%BE20201109153327.png)\'
elif int(stat) == 1:
    name = \'发布失败!\'
    tupian = \'![file](https://prod-private.oss-cn-beijing.aliyuncs.com/yw/QQ%E6%88%AA%E5%9B%BE20201109163201.png)\'

url = "https://oapi.dingtalk.com/robot/send?access_token=022d90fsadaplfs8fgjsc4dc4c86cdf4ed666"
title = job + name
nowtime = datetime.datetime.now()
nowtime = str(nowtime.strftime(\'%Y-%m-%d %H:%M:%S\'))
msg = """### %s \\n
> 时间: %s \\n
> 分支: %s \\n
> 编号: #%s \\n
> 地址: [工程链接](http://10.0.9.115:8080/job/%s) \\n
%s
"""
 
def Alert():
    headers = {"Content-Type": "application/json"}
    data = {"msgtype": "markdown",
        "markdown": {
            "title": title,
            "text": msg %(title, nowtime, branch, bianhao, job, tupian)
        }
    }

    r = requests.post(url, data=json.dumps(data), headers=headers, verify=False)
    print(r.text)
Alert()

6.在OSS的prod-private的ubcket中,yw文件夹存储着构建时通知的图片

图片放到这里,可以拿去用,都是同大小的
成功:

失败:

7.编写pipeline配置

pipeline {
    agent any
    options {
        buildDiscarder(logRotator(numToKeepStr: \'10\'))
    }
    environment {
        workspace = pwd()
        release_branch = \'master\'
    }
    post { //直接复制这段到pipeline阶段内
        success {
            sh "/jen_script/dingding.py ${JOB_NAME} ${release_branch} 0 ${BUILD_NUMBER}"
        }
        failure {
            sh "/jen_script/dingding.py ${JOB_NAME} ${release_branch} 1 ${BUILD_NUMBER}"
        }
    }

8.发一版测试

六.HTTP请求通知

使用HTTP Request插件,我们能在Jenkins pipeline中发送HTTP请求给第三方系统。这是最通用的Jenkins与第三方系统集成的方式之一。

HTTP Request插件提供了httpRequest步骤,代码示例如下:

steps {
    script{
        def response = httpRequest(url: \'http://192.168.88.3:8081\',acceptType:"APPLICATION_JSON",
        contentType: "APPLICATION_JSON",
        httpMode: "POST",
        authentication: "http_request",
        customHeaders:[
            [name: "headername", value: "headerValue"],
            [name: "token", value: "secret", maskValue: true]
        ],
        requestBody: "{\'buildNumber\': \'${env.BUILD_NUMBER}\'}",
        timeout: 5,
        validResponseCodes: "200:302")

        echo "${response.status}"
        echo "${response.content}"
    } //end of script
}

httpRequest步骤返回的response对象包含两个字段。

  • content :响应内容
    -status :响应码

以下是httpRequest步骤支持的参数

  • url:字符串类型,请求URL
  • acceptType:枚举类型,HTTP请求Header的“Accept”的值类型为NOT_SET.TEXT_HTML、TEXT_PLAIN.APPLICATION_FORM、APPLICATION_JSON、APPLICATION_JSON_UTF8、APPLICATION_TAR、APPLICATION_ZIP、APPLICATION_OCTETSTREAM。
  • authentication :字符串类型,Username with password凭证的ID,采用的是HTTP Basic认证方式
  • consoleLogResponseBody :布尔类型,是否将请求的响应body
    打印出来
  • contentType:枚举类型,HTTP请求Header的“Content-type"的值类型,与acceptType支持的枚举一样
  • customHeaders : HttpRequestNameValuePair对象数组,HTTP请求Header部分的内容,该对象有3个参数
    • name :字符串类型,Header名称
    • value :字符串类型,Header值。
    • maskValue :布尔类型,是否隐藏 Header值。如果设置为true,则在打印时使用“*”代替。
  • httpMode:枚举类型,HTTP方法,有GET(默认)、HEAD.POST、PUT、DELETE、OPTIONS、PATCH。
  • httpProxy:字符串类型,HTTP代理地址
  • ignoreSslErrors :布尔类型,是否忽略SSL错误。
  • requestBody :字符串类型,请求的body内容。
  • timeout :整型,超时时间,单位为秒。默认值为0,代表不设置超时时间。
  • validResponseCodes :字符串类型,代表HTTP请求成功的状态码。它支持3种格式的值。
    • 单状态值:比如200,当收到200响应状态码时,表示HTTP请求成功。
    • 多状态值:当响应状态码符合多个状态码中的一个时,代表请求成功。多个状态码之间使用逗号(,)分隔。比如200,404,500。
    • 范围状态值∶格式为“From : To”。比如200 : 302,代表收到200到J302的响应状态码都代表请求成功。
  • validResponseContent :字符串类型,比如设置它的值为"showme.codes”,那么只有当HTTP返回的内容中包含了
    "showme.codes”时,才代表请求成功。
  • quiet :布尔类型,是否关闭所有的日志打印,默认值为false。
  • responseHandle:枚举类型,获取HTTP响应内容的方式。其值可以为
    • NONE:不读取响应内容。
    • LEAVE_OPEN:当执行完请求后,并不会返回响应的内容,而是返回一个打开了的inputStream,由你自己决定该如何读取响应内容。但是在使用完之后,记得调用input-Stream的close ()方法关闭。
    • STRING(默认值)∶将响应内容转换成一个字符串。
  • outputFile:字符串类型,请求响应内容的输出路径。
本文版权归作者所有,欢迎转载,请务必添加原文链接。

以上是关于Jenkins构建通知的主要内容,如果未能解决你的问题,请参考以下文章

jenkins-job构建完成后通知企业微信

Jenkins构建通知

Jenkins 多分支构建中的邮件配置

Jenkins 配置邮件通知

使用钉钉通知Jenkins构建结果

如何在 Jenkins 中向开发人员发送构建失败的电子邮件通知