目录
1、前言
1 .1、插件简介
1.2、插件安装
2、创建Maven项目
2.1、新建一个全新的项目
2.2、拷贝已有项目
3、项目配置
3.1 、General
3.2、源码管理
3.3、构建触发器
3.4、构建环境
3.5、Pre Steps
3.6、Build
1)Root POM
2)Goals and options
3)【高级】
3.7、Pre Steps
3.8、构建环境
3.9、Post Steps⁎⁎⁎
4、配置邮件通知服务
4.1、安装Email Extension Plugin插件
4.2、获取邮箱授权码
4.3、配置Jenkins邮箱通知
4.4、配置邮件通知
4.5、Extended E-mail Notification配置
1)、配置SMTP服务器地址及其端口
2)、配置邮件登录凭证
3)、配置邮件通知标题、内容
4)、Extended E-mail Notificati其他配置
4.5、项目配置
4.6、邮件效果
本文主要介绍Jenkins自动打包、推送,发布,邮件通知,Jenkins具体配置参考之前文章
(一)Jenkins部署、基础配置
(二)Jenkins全局工具配置
1、前言
1 .1、插件简介
有很多插件都是选择的默认的安装的,Git plugin 和 Maven Integration plugin、publish over SSH、Deploy to container、Subversion
Git | 3.11.0 | 使用Git访问远程仓库 |
Git Push Plugin | 34 | 通过Git 插件执行 git push 作为构建后的步骤 |
Gitee Plugin | 1.2.7 | 允许 Gitee 在提交代码或打开/更新拉取请求时触发 Jenkins 中的构建。它还可以将构建状态发送回 Gitee。 |
Maven Integration plugin | 3.20 | 这提供Jenkins和Maven之间的深度集成。它增加了对基于SNAPSHOT的项目之间自动触发的支持,以及对Junit等各种Jenkins发布程序的自动配置。 |
publish-over-ssh | 1.20.1 | 用于将编译结果发布到远程服务器 |
Deploy to container | 成功构建后将战争到容器Tomcat等。 | |
Subversion | svn插件 | |
Xcode integration | 提供构建器来构建xcode项目,调用agvtool和包。ipa文 |
Jenkins本身无法实现远程部署到Tomcat的功能,需要安装Deploy to container Plugin插件实现
1.2、插件安装
1). 安装SSH插件
如果没有安装SSH插件的话,是不支持配置远程SSH的,这里可以去插件里面看下,是否安装了。
2). 新增全局配置
环境配置, 管理Jenkins-->Configure System 找到 Publish over SSH,点击新增,新增SSH Server,输入Hostname,Username,Password,点击Test Configuration,提示:Success 代表SSH连通远端服务器,保存即可。
注:如果没有勾选 Use password authentication, or use a different key这个选项,点击测试连接,会报错:jenkins.plugins.publish_over.BapPublisherException: Failed to connect and initialize SSH connection
2、创建Maven项目
2.1、新建一个全新的项目
1)点击【新建Item】
2)输入任务名称
3)选择【构建一个maven项目】
4)点击【确定】,进入配置页面
2.2、拷贝已有项目
1)点击【新建Item】
2)输入任务名称
3)复制输入需要复制项目的名称,可下拉快捷选择
4)点击【确定】,进入配置页面,此时配置页面带有复制的项目配置,根据本项目需要修改即可
3、项目配置
如果是新建任务,则直接进入配置页面修改配置;如果是已有任务,则右上角查找项目名称,回车后进入此项目空间,左侧点击【配置】按钮,进入配置页面;或者是列表直接找到项目名称,点击项目名称进入此项目;
3.1 、General
(1)、描述
纯文本,备注,项目简介、用途等
(2)、Discard old builds(丢弃旧的构建)
配置build保留的次数与天数;发布包保留次数、天数
Jenkins job执行build后,会在服务器上留下build记录及发布包,这些内容会占用磁盘空间;默认配置是不勾选Discard old builds的,此时默认值为365,显然这个值过大了;
Jenkins job在每次build结束后(无论成功还是失败),都会自动执行Discard old builds,释放磁盘空间;
因此根据磁盘空间来设置选项,如果磁盘空间充足,则均为15,如果磁盘空间不足,则均设置为3;当然也可根据实际需求来设置;
如图配置也可:
其中“发布包保留天数”和“发布包最大保留”,这两个选项是通过 Discard old builds右下角【高级】按钮控制显示的;
(3)、Gitee 链接
默认值为:https://gitee.com
3.2、源码管理
1、选择代码管理,比如git
2、输入地址
3、添加凭据,建议以ssh登录
4、指定分支,默认*/master
配置源码仓库地址及账号,下图为Gitee示例
Repository URL:svn、Gitee代码地址;
Credentials(证书):已配置直接点击下拉框选择;第一次增加时需要点击【添加】按钮进行添加
3.3、构建触发器
当某个事件被触发时,自动重新构建项目;非必须,一般都通过build now手动执行构建;当然了解了触发器,可以根据触发器形式打造理想中的构建形式。
1)Build whenever a SNAPSHOT dependency is built
当job依赖的快照版本被build时,执行本job;即当代码有更新时就构建项目
2)Build after other projects are built
作用:配置关注的项目,当关注的项目构建后,构建本项目
3)Build periodically:隔一段时间定时build一次,不管版本库代码是否发生变化
日程表规则:
MINUTE Minutes whinin the hour(0-59)
HOUR The hour of the day(0-23)
DOM The day of the month(1-31)
MONTH The month(1-12)
DOW The day of the week(0-7) where 0 and 7 are Sunday.
第一个是代表分钟 H 表示随机
第二个是代表小时 9-15/4 9点到下午三点期间的每隔4个小时
第三个是代表天 * 任意一天
第四个是代表月份 1-11 表示1到11月份
第五个是代表星期 1-5 表示工作日没有用到 H 随机的话,不要加括号
H(9-18) 9点到18点 中随机的一个点
eg:
* * * * * 表示任何一个时间段,同一个时间都可能会触发执行。不建议使用
H/30 * * * * 表示每天每隔 30分钟构建一次
H 4-19/3 * * * 表示,一天的凌晨点到下午7点,每隔3个小时构建一次
* * 3-5 * * 表示,每个月的3号,4号,5号 都会被构建,具体时间未知
* * * * 1-5 表示,工作日时会构建,具体时间未知
H/30 8-19/3 1-28 1-11 1-5 表示 在1月到11月中的1号-28号,每个工作日,早晨的8点到下午7点每隔3.5个小时会触发构建(个人怀疑此条规则说错了,H/30意思就是每30分钟一次)H */12 * * * 表示每12小时会触发构建
H/30 11-13/1 21-28 4-5 1-5 经验证,为11:20到13:50,每隔30分钟构建一次(11:20、11:50、12:20、12:50、13:20、13:50),而且是到13点50才结束
个人配置如图 ,每天中午12点定时构建一次:
4)Poll SCM:轮询构建
指定一段时间间隔去扫描代码仓库的代码是否有变更,如果有,则出发项目构建;
日程表的规则应该是遵循上述规则,未验证;
3.4、构建环境
非必须,但建议勾选Delete workspace before build starts。勾选此选项后,每次打包前jenkins会先删除工作区代码再打包;如果不勾选此选项,开发人员删除某些代码文件,但是此文件仍然在工作区保留,打包时仍然会带着打包,有可能会通过打包引起的bug;
每次重新构建时都会从配置的源码地址取到最新的项目代码放到工作区中,但是Jenkins只会将代码放到工作区中,而不执行删除操作,同样的文件会覆盖掉,但如果新的代码中有些文件已经删除了,则在工作区中还会保留。所此需要构造这个选项。
3.5、Pre Steps
构建前操作,一般不需要配置
3.6、Build
1)Root POM
对应的pom.xml路径,此路径是相对于workspace的相对路径;注意:是相对位置,如果该文件不存在,会有红色字提示。
2)Goals and options
打包命令,不要加mvn,默认前缀会加;一般为空即可,如果有需要再添加内容;可添加maven命令。
clean package -Dmaven.test.skip=true(清除以前的包,重新打包,并跳过测试)
3)【高级】
点击高级按钮,配置maven,若在安装Jenkins后已对系统配置maven,则无需每次新建项目再次配置maven
3.7、Pre Steps
构建后操作:如果需要实现自动构建自动发布,则需要配置,或在Post Steps选项下配置
Execute Windows Batch command:执行Windows批处理命令
Execute shell:执行shell脚本
Invoke Ant:调用Ant脚本
Invoke Gradle script:调用Gradle脚本
Invoke top-level Maven targets:调用Maven项目等
Send files or execute commands over SSH:通过SSH发送文件或执行命令
Set build status to 'pending'on GitHub commit:构建状态设置为“等待我们GitHub提交
3.8、构建环境
Send files or execute commands over SSH after the build runs:这个表示在构建之后,执行向指定远程服务器发送文件或者在远程服务器执行脚本命令
add timestamps to the Console Output 表示构建控制台的日志加上时间戳
3.9、Post Steps⁎⁎⁎
配置Send files or execute commands over SSH,实现远程将自动构建的jar包上传至远程服务器
1)run only if build succeeds
只有在构建成功后再运行下面步骤,
2)send files or execute commands over ssh
表示在构建之后,执行向指定远程服务器发送文件或者在远程服务器执行脚本命令,点击按钮Add post-build step选择添加
3)send files or execute commands over ssh 配置
点击高级对 脚本相关信息配置
SSH Server Name:要拷贝的远程服务器,下拉选择系统配置选项配置好的服务器
Transfer Set source files:相对于工作空间的相对目录,例如:包在tatget/*.jar,
可以填写多个,默认用逗号分隔,输入**/*表示所有目录下的所有文件
remove prefix:去除前缀,传到远程服务器上去掉此路径,比如:为空的话,传到服务器的地址为 上面全局配的 目录起始位置,例如此处:target/
remote directory: 远程服务器包存放位置,相对于系统配置中配置SSH服务目录下路径,例如SSH服务器配置路径为: /home,这里配置为test/,文件上传后目录为:/home/testexec command: 在文件传输完成后,在远程服务器执行的脚本命令(拷贝文件后,需要在服务器上要执行的脚本/命令)需要在部署服务器对应目录下新建
shell
脚本exec timeout:脚本执行超时时间,尽量大一些,不然脚本没执行完任务就结束了
exec in pty:执行脚本后超时会自动退出
示例:
Source files选项是相对于project workspace的,输入
**/*
表示所有目录下的所有文件
Remote directory选项是配置的远程服务器相对路径(或者服务器的绝对路径?)
Exec command选项是在文件传输完成后,在远程服务器执行的脚本命令。Name: 远程服务器IP
Source files:target/*.jar
Remove prefix: target/
Remote directory: /dyt
exec command文件传输后执行命令,启动服务
source /etc/profile
project=sendEmail-0.0.1-SNAPSHOT.jar
echo "文件目录"
dir=/home/dyt/
pid=`ps -ef | grep $dir$project | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
kill - $pid
fi
echo "运行构建的jar包"
nohup java -jar $dir$project >/dev/null 2>&1 &
控制台输出查看结果:
Started by user administrator
Running as SYSTEM
Building in workspace C:\ProgramData\Jenkins\.jenkins\workspace\sendEmail
The recommended git tool is: NONE
using credential 0cdd1aa5-60b1-4f47-9bf8-dab98e3619dc
> git.exe rev-parse --resolve-git-dir C:\ProgramData\Jenkins\.jenkins\workspace\sendEmail\.git # timeout=10
Fetching changes from the remote Git repository
> git.exe config remote.origin.url https://toscode.gitee.com/dyt314569024/test.git # timeout=10
Fetching upstream changes from https://toscode.gitee.com/dyt314569024/test.git
> git.exe --version # timeout=10
> git --version # 'git version 2.39.0.windows.2'
using GIT_ASKPASS to set credentials
> git.exe fetch --tags --force --progress -- https://toscode.gitee.com/dyt314569024/test.git +refs/heads/*:refs/remotes/origin/* # timeout=10
> git.exe rev-parse "refs/remotes/origin/master^{commit}" # timeout=10
Checking out Revision b71f4fa4b13fa2cc65363ff4d0bea9e1fb31c4e0 (refs/remotes/origin/master)
> git.exe config core.sparsecheckout # timeout=10
> git.exe checkout -f b71f4fa4b13fa2cc65363ff4d0bea9e1fb31c4e0 # timeout=10
Commit message: "11"
> git.exe rev-list --no-walk b71f4fa4b13fa2cc65363ff4d0bea9e1fb31c4e0 # timeout=10
Parsing POMs
Modules changed, recalculating dependency graph
Established TCP socket on 11918
[sendEmail] $ java -cp C:\ProgramData\Jenkins\.jenkins\plugins\maven-plugin\WEB-INF\lib\maven35-agent-1.14.jar;F:\apache-maven-3.6.1\boot\plexus-classworlds-2.6.0.jar;F:\apache-maven-3.6.1/conf/logging jenkins.maven3.agent.Maven35Main F:\apache-maven-3.6.1 C:\ProgramData\Jenkins\war\WEB-INF\lib\remoting-3077.vd69cf116da_6f.jar C:\ProgramData\Jenkins\.jenkins\plugins\maven-plugin\WEB-INF\lib\maven35-interceptor-1.14.jar C:\ProgramData\Jenkins\.jenkins\plugins\maven-plugin\WEB-INF\lib\maven3-interceptor-commons-1.14.jar 11918
<===[JENKINS REMOTING CAPACITY]===>channel started
Executing Maven: -B -f C:\ProgramData\Jenkins\.jenkins\workspace\sendEmail\pom.xml -s F:\apache-maven-3.6.1\conf\settings.xml -gs F:\apache-maven-3.6.1\conf\settings.xml clean package -Dmaven.test.skip=true(清除以前的包,重新打包,并跳过测试)
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< com.ykx.mail:sendEmail >-----------------------
[INFO] Building sendEmail 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ sendEmail ---
[INFO] Deleting C:\ProgramData\Jenkins\.jenkins\workspace\sendEmail\target
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ sendEmail ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 5 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ sendEmail ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 25 source files to C:\ProgramData\Jenkins\.jenkins\workspace\sendEmail\target\classes
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ sendEmail ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\ProgramData\Jenkins\.jenkins\workspace\sendEmail\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ sendEmail ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ sendEmail ---
[INFO] No tests to run.
[JENKINS] Recording test results
[INFO]
[INFO] --- maven-jar-plugin:3.1.2:jar (default-jar) @ sendEmail ---
[INFO] Building jar: C:\ProgramData\Jenkins\.jenkins\workspace\sendEmail\target\sendEmail-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.2.6.RELEASE:repackage (repackage) @ sendEmail ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16.466 s
[INFO] Finished at: 2023-01-19T23:04:56+08:00
[INFO] ------------------------------------------------------------------------
Waiting for Jenkins to finish collecting data
[JENKINS] Archiving C:\ProgramData\Jenkins\.jenkins\workspace\sendEmail\pom.xml to com.ykx.mail/sendEmail/0.0.1-SNAPSHOT/sendEmail-0.0.1-SNAPSHOT.pom
[JENKINS] Archiving C:\ProgramData\Jenkins\.jenkins\workspace\sendEmail\target\sendEmail-0.0.1-SNAPSHOT.jar to com.ykx.mail/sendEmail/0.0.1-SNAPSHOT/sendEmail-0.0.1-SNAPSHOT.jar
SSH: Connecting from host [DYT]
SSH: Connecting with configuration [dytCS] ...
SSH: Creating session: username [root], hostname [192.168.6.77], port [22]
SSH: Connecting session ...
channel stopped
SSH: Connected
SSH: Opening SFTP channel ...
SSH: SFTP channel open
SSH: Connecting SFTP channel ...
SSH: Connected
SSH: cd [/home]
SSH: OK
SSH: cd [/home]
SSH: OK
SSH: cd [dyt/]
SSH: OK
SSH: put [sendEmail-0.0.1-SNAPSHOT.jar]
SSH: OK
SSH: Opening exec channel ...
SSH: EXEC: channel open
SSH: EXEC: STDOUT/STDERR from command [source /etc/profile
project=sendEmail-0.0.1-SNAPSHOT.jar
echo "文件目录"
dir=/home/dyt/
pid=`ps -ef | grep $dir$project | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
kill - $pid
fi
echo "运行构建的jar包"
nohup java -jar $dir$project >/dev/null 2>&1 &] ...
SSH: EXEC: connected
鏂囦欢鐩綍
bash: 绗� 8 琛岋細kill: 锛氭棤鏁堢殑淇″彿澹版槑
杩愯鏋勫缓鐨刯ar鍖�
SSH: EXEC: completed after 213 ms
SSH: Disconnecting configuration [dytCS] ...
SSH: Transferred 1 file(s)
Finished: SUCCESS
备注:高级选项勾选:Verbose output in console,代表可以在控制台看到执行结果,不勾选虽然执行成功了那么看不到。
windows的服务器执行文件,python文件或者其他,需要使用execute windows batch commend 。liunx 下使用execute shell
4、配置邮件通知服务
4.1、安装Email Extension Plugin插件
安装路径:Manage Jenkins>Manage Plugins
4.2、获取邮箱授权码
测试用的QQ邮箱,确保POP3/SMTP/IMAP服务是开启的,点击生成授权码,发送短信获取授权码,用于后续配置登录凭证
4.3、配置Jenkins邮箱通知
Manage Jenkins > Configure System下,Jenkins Location中配置系统管理员的邮箱地址
拖动页面右侧滑块到页面最底部,接着进行邮件通知的相关配置
4.4、配置邮件通知
SMTP服务器:使用邮箱对应的服务器地址
用户默认邮件后缀:可不填,填了,代表其他创建的用户账号的默认邮箱后缀为填入的邮箱后缀
SMTP用户名/密码:发送邮件的账号,密码为获取的授权码
SMTP端口:SMTP对应服务器对应端口
通过发送测试邮件测试配置
Test e-mail recipient :接收测试邮件邮箱地址
Test configuration:测试配置,点击Test configuration按钮,为测试账号发送邮件,成功提示 Email was successfully sent
测试时若出现 javax.mail.MessagingException: Got bad greeting from SMTP host: smtp.163.com, port: 465, response: [EOF] 错误,则查看使用的端口是否需要使用SSL协议
在配置上以上邮件通知并测试通过,测试邮箱成功收到测试邮件后,还需对Extended E-mail Notification模块进行配置(这个模块是用于发送构建后的报告邮件,不进行配置的话,在之后的项目构建中,你就会看到构建成功,邮件也发送成功,但是邮箱就是没有收到邮件)
4.5、Extended E-mail Notification配置
1)、配置SMTP服务器地址及其端口
常用邮箱 | SMTP服务器地址及端口 | POP3服务器地址及端口 |
QQ邮箱 | smtp.qq.com(端口:25) | pop.qq.com(端口:110) |
QQ企业邮箱 | pop.exmail.qq.com (SSL启用 端口:995) | smtp.exmail.qq.com(SSL启用 端口:587/465) |
126邮箱 | pop.126.com(端口:110) | smtp.126.com(端口:25) |
2)、配置邮件登录凭证
Credentials:添加凭证
密码重新获取授权码
凭证配置操作如图
注意:SMTP Username中的账号一定要与系统管理员的邮箱账号保持一致
3)、配置邮件通知标题、内容
由于邮件使用了Html编写,所以配置Default Content Type选择类型HTML (text/html),附邮件内容代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<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>
本邮件由系统自动发出,无需回复!<br/>
各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br>
<td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li>项目名称 : ${PROJECT_NAME}</li>
<li>构建编号 : 第${BUILD_NUMBER}次构建</li>
<li>触发原因: ${CAUSE}</li>
<li>构建状态: ${BUILD_STATUS}</li>
<li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>构建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
<li>项目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
</ul>
<h4><font color="#0B610B">失败用例</font></h4>
<hr size="2" width="100%" />
$FAILED_TESTS<br/>
<h4><font color="#0B610B">最近提交(#$SVN_REVISION)</font></h4>
<hr size="2" width="100%" />
<ul>
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
</ul>
详细提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>
</td>
</tr>
</table>
</body>
</html>
4)、Extended E-mail Notificati其他配置
4.5、项目配置
打开项目设置,找到选项卡构建后操作, 点击增加购进后操作步骤,选择Editable Email Notification。
Project Recipient List:填入收件人的邮箱账号,有多个账号时使用逗号隔开
Attachments:读取路径是主目录下的workspace文件夹 ,所以想要将报告以附件的形式发送的话,就需要在build文件中将报告的生成路径更改为项目的工作空间,
针对单个文件,直接填写相对路径;多个文件需要作为附件进行发送,可在Attachments中填入report/*.txt,如有多个文件的话,路径之间用英文逗号隔开,例如,项目根文件夹下有个文件1.txt,2.txt
Attach Build Log:选择是否发送构建日志
Content Type:内容类型,一般为html
Default Content:邮件内容,默认为系统设置
注:其他文件类型同理,路径同理,不支持发送文件夹,只能发送文件,一定要发送文件夹的话,就将其压缩成一个压缩文件
4.6、邮件效果
鸣谢:Jenkins配置邮件通知服务,完整教程(含发送成功无法接收邮件处理方案)_不定时总结的那啥的博客-CSDN博客_jenkins 邮件通知