Jenkins实现自动化邮件发送踩坑记录
文章简介
本文分享Jenkins实现邮件发送,就不演示如何安装,如果需要查看,可点击底部阅读原文,分享Jenkins多种安装方式。写这篇文章,是在实际使用Jenkins过程中遇到这样一个问题,当每次Jenkins构建成功或者失败后,需要个人登录Jenkins查看构建结果,同时在构建前做了数据备份,也需要手动的拷贝一份备份文件到本地。为了解决这个问题,便想到了Jenkins的邮件功能。在个人实践中,在每次master分支自动构建前,需要将数据库和代码打包、备份,在Jenkins构建结束之后,将备份的文件发送给对应的负责人。
文章部分细节的地方可能省略带过,因此需要对Jenkins有一定使用的用户比较合适,如果不熟悉的,可以参考上面提交的文章。文章涉及到不准确的信息还望反馈。
大致逻辑
接下来整个流程,也都按照该流程进行演示如何配置。
安装插件
首先点击管理,然后点击插件管理,跳转到插件中心。
如果没有安装过email对应的插件,点击可选插件按钮,然后输入email关键词,进行搜索即可。这里我已经安装过了,为了演示选择已安装菜单。
在安装插件的过程中,需要注意一个版本号。2.73版本的插件有一个bug,就是配置正确却不能发送邮件。建议避开这个版本号。
系统配置
安装好插件之后,接下来就需要进入系统配置。进入系统配置,主要配置两个地方,一个是管理员的邮箱地址,一个是插件的配置信息。
记住插件发送邮件的账号一定的和管理员的邮箱账号一致,否者会出现下面错误信息。
错误信息:
com.sun.mail.smtp.SMTPSenderFailedException: 553 Mail from must equal authorized user
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1587)
Caused: com.sun.mail.smtp.SMTPSendFailedException: 553 Mail from must equal authorized user;
nested exception is:
com.sun.mail.smtp.SMTPSenderFailedException: 553 Mail from must equal authorized user
at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2057)
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1580)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1097)
at javax.mail.Transport.send0(Transport.java:195)
at javax.mail.Transport.send(Transport.java:124)
at hudson.tasks.Mailer$DescriptorImpl.doSendTestMail(Mailer.java:581)
at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)
错误信息的大致意思就是说,邮箱的授权用户(插件配置的账号)和from(邮件发送者)账号不一致。
这里其实有点小困惑,邮件配置授权账户,为什么管理员的邮件账号还必须保持一致。按理来说,既然配置了授权用户,就采用配置的授权邮箱进行发送呗。可能是系统使用的管理员邮件发送。这里的配置授权仅仅是为了授权第三方邮箱账户吧。
项目配置
接下来,我们创建一个任务测试发送邮件。至于具体的配置这里省略带过,直接记录配置邮件的地方。
这里面就是针对该项目的具体配置信息,上面我们提交到系统配置,属于全局配置。如果这里没有配置,则默认走全局配置。大致的配置信息和全局配置都是相同的作用,可以根据不同的任务,自行配置即可。
邮件测试
最后配置完毕,当提交代码待仓库后,使用webhooks自动触发构建,登录邮箱就可以查看到下面的一些构建基础信息了。如果邮件需要更多的配置信息,直接到任务中去配置即可。
- RGW性能监控及源码实现
- JSP中文乱码的产生原因及解决方案
- 比较Swing中三种注册事件的方法
- Kafka单节点至集群的安装部署及注意事项
- JavaScript onchange 事件:表单文本域或选择域发生改变
- 利用反射比较两个对象字段值是否相等
- 更新Silverlight ctp到Silverlight beta 1.0
- JSON.stringify(), JSON.parse(), toJSON()方法使用
- compression功能测试
- 源码阅读再来一发:解读RGW中request的处理流程
- 绘制Crushmap分布图-Python
- RGW奇淫技巧-玩转system特权
- 源码走读rgw内置civetweb的参数初始化过程
- 重磅:Flume1-7结合kafka讲解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法