1.前言
Hello,各位小伙伴,大家好!!!
在前面的文章中,我们实现了用Maven项目任务和Pipeline流水线任务来完成对项目的自动化部署。
Docker+Jenkins+Gitee自动化部署maven项目
Docker+Jenkins+Gitee+Pipeline部署项目
既然是自动化构建部署,我们肯定不可能时时刻刻都去关注构建面板中任务的构建状态,最好的方式就是,构建完成后,将构建的结果通知到我们,例如邮件通知
、钉钉通知
等。
2.Email通知
Jenkins内置了简单的邮件通知功能供我们使用,同时,也有扩展插件Email Extension
来实现功能更全更强大的邮件通知。
2.1 使用Jenkins内置邮件通知
2.1.1 系统配置
话不多说。首先,我们来到系统管理---》系统设置
,填写你的邮箱。
然后,继续向下滑动页面,找到邮件通知,进行如下配置。
完成上述配置后,我们可以测试是否配置正确。
如下图所示,说明你已经配置成功了,收件箱会收到如下内容的邮件。
那么,一切准备就绪,接下来,就是把邮件通知加入到任务的构建过程中去。
2.1.2 Maven任务配置
对于构建maven项目的任务来说,我们需要找到构建设置,对配置进行如下调整。
可以看到,内置的Email通知,我们并不能根据任务的执行状态来进行邮件通知。
点击立即构建。
1)构建失败的场景
2)由构建失败转为构建成功的场景
3)上次构建成功,这次依然构建成功
经试验,上次构建成功,这次依然构建成功的情况,并不会发送邮件通知,这应该是Jenkins的机制,既然都构建成功了,也就没有不必再发送邮件通知,而是更多滴将通知聚焦于构建失败的场景,便于运维人员及时应对异常。
2.1.3 Pipeline任务配置
对于pipeline流水线任务来说,在进行配置之前,我们需要了解pipeline的一个语法:post
,毕竟只有掌握了用法,我们才能更加游刃有余。
post
:字面意思为后置,不妨大胆猜测下,其作用是:在任务执行结束之后才会执行。
没错,我们可以将其定义在pipeline块
或stage块
中,当它们执行完成后,根据执行的状态,来匹配post块中定义的条件,如果匹配,就往下执行。
示例:
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
// always,表示无论当前pipeline的执行状态如何,其都会执行。
always {
echo 'I will always say Hello again!'
}
}
}
下面我们来看看常见的匹配条件:
always
:表示不管其所在作用域的执行状态如何,始终执行。changed
:表示当前pipeline的执行状态与上一次不一样时,执行。fixed
:表示当前pipeline执行成功且上一次执行失败或不稳定时,执行。aborted
:表示当前pipeline被手动中止时,执行。failure
:表示其所在作用域的执行状态为失败时,执行。success
:表示其所在作用域的执行状态为成功时,执行。unstable
:表示当前pipeline的执行状态为不稳定时,执行。
了解了post块的用法之后,我们就可以开始尝试对pipeline脚本进行修改,这里我们需要用到片段生成器。生成的脚本如下:
mail bcc: '', body: 'See ${BUILD_URL}display/redirect;', cc: '', charset: 'UTF-8', from: 'xx@qq.com', mimeType: 'text/html', replyTo: '', subject: 'Build failed in Jenkins: ${JOB_NAME} #${BUILD_NUMBER}', to: 'xx@qq.com'
然后,将其组合到post块中。
// 存在bug的脚本,subject和body中用到的环境变量无法识别
post {
// failure:表示在pipeline的执行状态为失败时,执行。
failure {
mail bcc: '', body: 'See ${BUILD_URL}display/redirect;', cc: '', charset: 'UTF-8', from: 'xx@qq.com', mimeType: 'text/html', replyTo: '', subject: 'Build failed in Jenkins: ${JOB_NAME} #${BUILD_NUMBER}', to: 'xx@qq.com'
}
}
可是,经过测试,subject和body中用到的环境变量无法识别。
琢磨许久,感觉应该是个bug。将body和subject对应的值的单引号改为双引号
,就可以正确识别了。
post {
// failure:表示在pipeline的执行状态为失败时,执行。
failure {
mail bcc: '', body: "See ${BUILD_URL}display/redirect;", cc: '', charset: 'UTF-8', from: 'xx@qq.com', mimeType: 'text/html', replyTo: '', subject: "Build failed in Jenkins: ${JOB_NAME} #${BUILD_NUMBER}", to: 'xx@qq.com'
}
}
2.2 使用Email Extension插件邮件通知
上面,我们实现了使用Jenkins内置的邮件通知功能,唯一不足的点,不能根据任务的执行状态来选择发送邮件通知。想要自定义的小伙伴,可以使用Email Extension
插件。
2.2.1 安装插件
首先,我们在系统管理---》插件管理
中搜索Email Extension
并下载。
2.2.2 添加凭据
然后,我们需要添加一个凭据,用于存储邮箱的用户名和授权码,我这里使用的是qq邮箱。
2.2.3 系统设置
现在,我们就可以去完成最关键的配置了。点击系统管理---》系统设置
,找到Extend E-mail Notification
,进行如下配置。
2.2.4 Maven任务配置
对于Maven任务,我们需要找到构建后操作,没错,就是任务构建结束要进行的操作。
选择Editable Emial Notification
。
修改Advanced Settings
,在Triggers
中选择Failure-Any
,并收件人为Recipient List
。
配置完成后,如果任务构建失败,就会收到如下邮件。
2.2.5 Pipeline任务配置
同样滴,对于Pipeline任务,我们需要使用片段生成器,按自己所需添加条件,生成脚本。
我这里生成的脚本如下。
emailext body: 'See ${BUILD_URL}display/redirect;', mimeType: 'text/html', subject: 'Build failed in Jenkins: ${JOB_NAME} #${BUILD_NUMBER}', to: 'xx@qq.com'
然后,将其组合到post块中。
post {
failure {
emailext body: 'See ${BUILD_URL}display/redirect;', mimeType: 'text/html', subject: 'Build failed in Jenkins: ${JOB_NAME} #${BUILD_NUMBER}', to: 'xx@qq.com'
}
}
如果任务构建失败,就会收到如下邮件。
3.钉钉通知
不知各位小伙伴在办公时使用钉钉的多不,如果使用钉钉,可以在群聊中接入钉钉机器人,当任务构建成功/构建失败时,通知群里的小伙伴,也可谓是除了邮件通知之外的另一种好的方式。
下面,我们就来看看如何使用吧。
3.1 配置钉钉机器人
我这里在创建群聊时,发现,钉钉创建群聊的一个要求是,群成员的人数至少3人,如果只勾选2个成员,点击创建,会直接跳转到对方的聊天窗口,各位小伙伴在创建群聊时注意一下就好。
群聊创建成功后,找到右上角的群设置---》机器人---》添加机器人---》选择自定义
然后,对机器人进行配置,这里我们的安全设置选择加签的方式,会给我们生成用于验签的字符串。
点击完成,就会为我们创建一个钉钉机器人,并给我们生成一个Webhook地址。
3.2 安装插件
在钉钉中,创建好机器人之后,就需要我们在Jenkins中添加相应的插件了。
首先,在系统管理---》插件管理
中搜索DingTalk
并下载。然后,在系统管理里,在页面的末尾处,找到未分类,就能看到钉钉。
点击钉钉,进行配置。
在配置之后,我们可以点击右下角的测试按钮,测试是否配置正确。正常情况下,在群聊里就会收到一条消息。
我这里遇到一种情况就是,在安装插件后,完善了配置之后,发送测试通知也成功了,但是在任务中配置之后,始终收不到通知,怎么办呢?经过反复地尝试,最后选择了重启Jenkins,没错,问题就成功解决了。不得不赞叹,重启大法好!!!
3.3 Maven任务配置
OK,到这里我们就可以对任务进行配置了。对于Maven任务,找到钉钉机器人选项,添加我们已经设置好的机器人即可。
配置好之后,点击立即构建。
如果构建成功,就会收到如下消息通知。
如果构建失败,就会收到如下消息通知。
3.4 Pipeline任务配置
同样滴,对于Pipeline任务,我们也可以像配置Maven任务一样,直接快捷添加一个钉钉机器人。
当然,我们也可以在pipeline脚本中进行自定义,根据任务的执行状态来发送通知。
我这里使用的是markdown语法的消息类型,用来模仿前面发送的消息的效果。
post {
failure {
dingtalk (
// 创建机器人时生成的id
robot: '71382b7d-2624-48a3-950c-49103f263ef2',
// 消息类型
type: 'MARKDOWN',
title: '[${JOB_NAME}](${JOB_URL})',
text: [
'### [${JOB_NAME}](${JOB_URL})',
// 分割线
'---',
'- 任务:[${BUILD_DISPLAY_NAME}](${BUILD_URL})',
'- 状态:<font color="red">构建失败</font>'
]
)
}
}
接下来,我们来看看消息通知的效果。怎么样?
自我感觉还是比默认消息模板的差点意思啊。
4.后记
各位小伙伴,如果读完文章后觉得有所收获,还请多多支持。
做的不好的地方,希望各位小伙伴能够及时指出,非常感谢。