需求说明
jenkins个别项目构建时间较长,不想时刻关注构建情况,或构建成功后移交其他人继续处理,需要配置企业微信通知功能,本篇主要是针对pipeline和多分支流水线项目,自由风格类型项目可以使用插件Qy Wechat Notification ,参考博文https://www.cnblogs.com/jianxuanbing/p/11459972.html。
最终效果
本篇最终效果图
jenkins pipeline类型和多分支流水线类型项目,在构建完成后,不管失败还是成功,都会通知到企业微信群中,并@对应人,我这里做的是谁构建就通知谁,当然也可以使用参数化构建,把要通知的人通过参数传递进去。
实现过程
我这里使用的方法还是比较简单的,想到jenkins构建主要还是以pipeline为主,参考了下其他人写的python,然后跟pipeline一起使用就很怪异,所有我这里用pipeline+shell,并没有其他人做的那么复杂。首先必须是企业微信,创建三个人以上的群聊,添加一个机器人 创建机器人主要是为了接受我们传递的消息和提供一个控制它的API,记住机器人的webhook,下面的shell脚本将通过webhook方式调用它 企业微信目前支持文本和markdown类型@群成员,其他的不行,详情请查看企业微信API开发
安装插件
获取构建用户变量 需安装插件: build user vars plugin 获取构建时间变量 需安装插件:Build Timestamp Plugin
编写shell
shell脚本用于请求企业微信API,发送数据。详情请看
vim send_message-export.sh
#!/bin/sh
CHAT_WEBHOOK_KEY="c5ae4999-be22-491f-xxxxxxxxxxxxx"
CHAT_CONTENT_TYPE='Content-Type: application/json'
if [ _"${TYPE}" = _"success" -o _"${TYPE}" = _"failure" ]; then
CHAT_WEBHOOK_URL='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key'
fi
if [ _"${CHAT_WEBHOOK_KEY}" = _"" ]; then
echo "please make sure CHAT_WEBHOOK_KEY has been exported as environment variable"
fi
echo "## send message for : ${TYPE}"
if [ _"${TYPE}" = _"success" ]; then
curl "${CHAT_WEBHOOK_URL}=${CHAT_WEBHOOK_KEY}" \
-H "${CHAT_CONTENT_TYPE}" \
-d '
{
"msgtype": "markdown",
"markdown": {
"content": "<font color=\"warning\">**Jenkins任务通知**</font> \n
>构建人:<font color=\"comment\">'"${BUILD_USER}"'</font>
>构建时间:<font color=\"comment\">'"${BUILD_TIME}"'</font>
>任务名称:<font color=\"comment\">'"${JOB_NAME}"'</font>
>任务地址:<font color=\"comment\">[点击查看]('"${URL_JOB}"')</font>
>构建日志:<font color=\"comment\">[点击查看]('"${URL_LOG}"')</font>
>构建状态:<font color=\"info\">**Success**</font> \n
>任务已构建完成请确认:<@'"${JOB_TIPS1}"'>"
}
}
'
elif [ _"${TYPE}" = _"failure" ]; then
curl "${CHAT_WEBHOOK_URL}=${CHAT_WEBHOOK_KEY}" \
-H "${CHAT_CONTENT_TYPE}" \
-d '
{
"msgtype": "markdown",
"markdown": {
"content": "<font color=\"warning\">**Jenkins任务通知**</font> \n
>构建人:<font color=\"comment\">'"${BUILD_USER}"'</font>
>构建时间:<font color=\"comment\">'"${BUILD_TIME}"'</font>
>任务名称:<font color=\"comment\">'"${JOB_NAME}"'</font>
>任务地址:<font color=\"comment\">[点击查看]('"${URL_JOB}"')</font>
>构建日志:<font color=\"comment\">[点击查看]('"${URL_LOG}"')</font>
>构建状态:<font color=\"comment\">**Failure**</font>
>任务已构建完成请确认:<@'"${JOB_TIPS1}"'>"
}
}
'
fi
把shell脚本放到gitlab项目的根目录
编写jenkinsfile
主要用到pipeline参数:post post 部分定义一个或多个steps ,这些阶段根据流水线或阶段的完成情况而 运行(取决于流水线中 post 部分的位置). post 支持以下 post-condition 块中的其中之一: always, changed, failure, success, unstable, 和 aborted。这些条件块允许在 post 部分的步骤的执行取决于流水线或阶段的完成状态。 Conditions always 无论流水线或阶段的完成状态如何,都允许在 post 部分运行该步骤。
changed 只有当前流水线或阶段的完成状态与它之前的运行不同时,才允许在 post 部分运行该步骤。
failure 只有当前流水线或阶段的完成状态为"failure",才允许在 post 部分运行该步骤, 通常web UI是红色。
success 只有当前流水线或阶段的完成状态为"success",才允许在 post 部分运行该步骤, 通常web UI是蓝色或绿色。
unstable 只有当前流水线或阶段的完成状态为"unstable",才允许在 post 部分运行该步骤, 通常由于测试失败,代码违规等造成。通常web UI是黄色。
aborted 只有当前流水线或阶段的完成状态为"aborted"。当前执行结果是中止状态时(一般为人为中止)执行,才允许在 post 部分运行该步骤, 通常由于流水线被手动的aborted。通常web UI是灰色。
cleanup 清理条件块。不论当前完成状态是什么,在其他所有条件块执行完成后都执行。post部分可以同时包含多种条件块。
在jenkinsfile文件最底部添加:
pipeline {
agent {
label "jenkins_slave"
}
options {
timeout(time: 30, unit: 'MINUTES')
buildDiscarder(logRotator(numToKeepStr: '5', artifactNumToKeepStr: '5'))
}
stages {
stage('setting env') {
agent any
options {
skipDefaultCheckout(true)
}
steps {
//配置构建人变量
wrap([$class: 'BuildUser']) {
script {
BUILD_USER = "${env.BUILD_USER}"
BUILD_USER_ID ="${BUILD_USER_ID}"
}
}
script {
env.BUILD_USERNAME = "${BUILD_USER}"
env.BUILD_USERNAMEID = "${BUILD_USER_ID}"
}
...
...略写了,以自己的为准
...
post {
success {
script {
sh 'export TYPE=success;export JOB_NAME="${JOB_BASE_NAME}";export BUILD_NUM="$BUILD_NUMBER";export BUILD_TIME="$BUILD_TIMESTAMP";export BUILD_USER="${BUILD_USERNAME}"; export URL_JOB="${BUILD_URL}";export URL_LOG="${BUILD_URL}console";export JOB_TIPS1="${BUILD_USERNAMEID}" ;sh send_message-export.sh'
}
}
failure {
script {
sh 'export TYPE=failure;export JOB_NAME="${JOB_BASE_NAME}";export BUILD_NUM="$BUILD_NUMBER";export BUILD_TIME="$BUILD_TIMESTAMP"; export BUILD_USER="${BUILD_USERNAME}"; export URL_JOB="${BUILD_URL}";export URL_LOG="${BUILD_URL}console";export JOB_TIPS1="${BUILD_USERNAMEID}" ;sh send_message-export.sh'
}
}
}
}
简单说下原理吧 1、Jenkins通过jenkinsfile文件构建任务 2、jenkinsfile文件在最后使用了post参数,判断该任务状态,然后调用shell脚本,把jenkins构建过程中获得的数据传递到shell脚本里 3、shell脚本开始请求企业微信机器人Webhook,发送信息到企业微信群聊中
测试一下
|