虽然两三年前配过一次,细节已经没啥印象了,今天又重新配置了一次,只感觉这个配置好多坑。也是因为自己对这一套的原理理解不到位吧,但是不得不说,还是坑,设计和提示地不人性化。
1.细节很多,但是具体的说明不显眼;
2.执行job,你以为成功了,但是收件箱就是没有收到,此时job的console output中是没有反馈的;
3.邮件配置还有Email Extension Plugin是啥关系,有点分不清楚;
4.pipeline中没有构建后的操作,如何发送邮件。
-----------------------------------------------------------------------------
这里将整个配置的过程都记录一下。
首先,在配置之前需要对邮箱系统的设计有个大概的了解,不然里面的SMTP服务器,协议等内容可能会把人绕晕。相关的内容会在后续的博客中进行整理说明。这里就先简单说明整个配置的关键步骤。
进入配置界面后,首先填入系统管理员的邮箱地址。这里建议将该地址与后续的默认发送邮箱地址填写一致,不然会出问题。
配置到这里,我们还需要额外做一件事情:配置发送邮件地址/系统管理员邮件地址的SMTP/POP3服务,这可能需要在对应邮箱的账户配置中进行设置。我这里是用的qq邮箱,所以需要在qq邮箱客户端的账户中进行配置:
进一步:
保证该服务的开启是我们使用第三方程序进行邮件发送的前提。其它如126,163,gmail等等种类的邮箱都会有该配置,配置Jenkins邮件服务时,需要保证对应类型邮件服务器的账户的服务已开启。
相应的,有些种类的邮箱配置好后,在jenkins的发送邮件账户密码一栏就填写这个邮箱的密码,而qq邮箱这里填写的是开启SMTP服务时生成的授权码。
下一步,在配置好上述的内容后,我们需要清楚,在jenkins中,把基础的邮件服务配置好就能够实现邮件通知,Email Extension Plugin实际上是一个锦上添花的东西,比如更方便的去配置内容样式...并不是说,必须要配置这个扩展插件才能实现发送邮件的功能。所以在深入了解邮件的扩展功能之前,我们这里先保证邮件服务是OK的。
点开邮件服务下的高级选项,我们需要将其中的参数全部配置正确。
smtp服务器的地址填写对应类型邮件服务器的地址,这个地址一般在客户端都会有描述。如下所示,这种信息在搜索引擎上查查对应的官方说明很容易:
smtp服务的端口这里一般也会随服务器地址等信息一并说明。
另外,这里的发送通知邮件的邮箱地址建议与系统管理员的邮箱地址保持一致。这里的密码,有些直接使用邮箱密码,有些需要使用配置SMTP服务的第三方授权码。
到这里,我们上面的配置工作基本完成。但如果其中任何环节有问题,那么你会发现,在具体的job中,发送邮件的Console Output是这样的:
你以为邮件会发送成功?但是真正是否成功,这里的提示并不能作为判断依据,只能是在收件箱的一方去查看。所以,在配置完成之后,最好使用邮件服务提供的测试按钮和自己的接收邮箱进行测试,如果能够保证接收到邮件,才能进行后续的配置工作:
-----------------------------------------------------------------------------
到这一步,我们算是把邮件服务配置通了。后续需要在具体的job中进行邮件发送策略和内容的配置。首先可以看看一个freestyle的job(与pipeline不同),这里可以配置构建后操作,其中有几个Email相关的选项:
可以看出来,一个是简单配置,一个是带一些内容编辑的,一个可以有模板相关的功能。这里具体就不详细展开,无非就是配置接收邮箱地址,发送邮件的策略,内容的模板编辑(其中可能会有一些系统变量的使用)等,并没有什么很复杂的花样。
然后,看看pipeline的配置中,这个构建后操作选项是没有的,这就要求我们需要在pipeline的脚本中进行设置。这里给出一个例子:
pipeline { agent any stages { stage('Hello') { steps { echo 'Hello World' } } } post{ success{ //always部分 pipeline运行结果为任何状态都运行 emailext body: '''<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4" offset="0"> <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif"> <tr> <td> <b><font color="#0B610B">Build Summary</font></b> <hr size="2" width="100%" align="center" /> </td> </tr> <tr> <td> <ul> <li>Project Name: ${PROJECT_NAME}</li> <li>Build Number: # ${BUILD_NUMBER}</li> <li>Build Cause: ${CAUSE}</li> <li>Build Status: ${BUILD_STATUS}</li> <li>Build Log: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li> <li>Build Url: <a href="${BUILD_URL}">${BUILD_URL}</a></li> <li>Project Url: <a href="${PROJECT_URL}">${PROJECT_URL}</a></li> </ul> </td> </tr> </table> </body>''', subject: '[Jenkins Build Notification] ${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', to: 'xxx@qq.com', from: 'yyy@qq.com' } failure { //当此Pipeline失败时打印消息 echo 'failure' } unstable { //当此Pipeline 为不稳定时打印消息 echo 'unstable' } aborted { //当此Pipeline 终止时打印消息 echo 'aborted' } changed { //当pipeline的状态与上一次build状态不同时打印消息 echo 'changed' } } }
注意这里的from和to的邮箱地址就是配置好的发送邮件人的邮箱地址和接收人的邮箱地址。另外,如果每次构建都要求发送邮件的话,可以将success改为always,而如果需要对应场景下邮件发送的话,这个success可以修改为failure,unstable...
在邮件的body中,这里使用了一些常用到的系统变量,如果需要扩展,也可以在这个基础上进行扩写。