jenkins基础
Jenkins基础
一、jenkins安装
1.1 安装java环境
1 | # 查询jdk版本有哪些 |
1.2 安装maven
1 | # 下载maven |
注意:

这里的maven的runtime是有可能是jre,不是jdk,有坑。
如果在maven构建时出现no compiler is privided in this environment.则需要安装jdk环境
1 yum install -y java-devel
1.3 更改maven镜像源
1 | # 找到标签<mirrors>更改为阿里云镜像源 |
1 | <mirrors> |
1.4 安装Jenkins
[jenkins官网]https://www.jenkins.io/ 官网中说明很详细。
1 | sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo |
访问 http://ip:8080/ 根据提示操作下一步,使用推荐的插件进行安装即可。ip为安装Jenkins机器的ip地址。
二、构建maven项目
默认安装的插件中没有Maven Integration plugin,新建item中没有构建一个maven项目这个选项。
2.1 安装Maven Integration plugin插件

成功安装后,在新建item中就多出构建一个maven项目选项,如图。

2.2 新建maven构建项目
新建item,任务名称为testProject01,选择构建一个maven项目。

2.2.1 基础配置
配置源码管理。

注意:
提示
Failed to connect to repository : Error performing git command: git ls-remote -h https://git.yuencode.cn/jiaxiaoyu/jenkins-springboot.git HEAD,则是没有git环境。
1
2# 使用yum命令安装git
yum install -y git提示
Jenkins needs to know where your Maven is installed.Please do so from the tool configuration.则是没有配置maven路径。
配置maven路径,
Manage Jenkins ---> Global Tool Configuration ---> Maven, http://ip:8080/manage/configureTools/
配置好源码管理后,其它配置默认,保存,即可查看一下构建效果。点击构建。

片刻后,在左下角的构建执行状态中可查看到当期正在构建的job,点击进去。

进入当期项目页面,在左下角有正在构建的job,再次点击进入。

进入此页面可查看控制台输出。

构建完成后,可以查看到生成的jar路径:/var/lib/jenkins/workspace/testProject01/target/jenkins-springboot-0.0.1-SNAPSHOT.jar
1 | [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ jenkins-springboot --- |

手动运行试试
1 | [root@localhost ~]# cd /var/lib/jenkins/workspace/testProject01/target/ |

2.2.2 自动化发布到测试服务器并运行
安装publish over ssh插件

安装成功后,添加要使用publish over ssh的服务器.


打开testProject01任务,修改配置。

添加Post Steps,选择Send files or execute commands over SSH通过ssh发送文件或执行命令。

添加如下配置:

再次执行job,构建成功。

查看进程


2.2.3 编写清理脚本
可以发现以上的配置存在问题,如果jenkins-springboot进程存在,再次执行job,springboot端口会冲突启动失败。
编写一个停止springboot应用的简单脚本stopApp.sh,存放在/root/jars目录中
stopApp.sh
1 |
|
添加可执行权限:
1 | [root@localhost jars]# chmod +x stopApp.sh |
测试:传入应用名
1 |
|
添加一个Pre Steps,选择Send files or execute commands over SSH.在构建前执行脚本停止该应用。

Send files or execute commands over SSH插件:
Remote Directory
- 全局Remote Directory:决定ssh传输文件的根路径。
- steps中的Remote Directory:决定ssh传输文件在根路径下的相对路径。即实际上文件传输路径为全局的Romote Directory与Steps中配置的Remote Directory相加。
例如在全局中配置的Remote Directory:/testDir/aaa/bbb,在某个Steps中配置的Remote Directory:jars,那么文件将传输到/testDir/aaa/bbb/jars中。

注意:
全局Remote Directory:配置的路径必须存在,例如:/testDir/aaa/bbb必须事先存在,否则不会自动创建。
steps中Remote Directory:配置路径并不需要手动创建,不存在将会自动创建。如果全局Remote Directory没有配置,则默认进入当前ssh用户的home目录。
Exec command
输入的命令不能存在“卡顿”,
nohup java -jar /root/jars/jenkins-springboot-*.jar &>jekins-springboot.log &与nohup java -jar /root/jars/jenkins-springboot-*.jar &两个命令的区别。后者存在“卡顿”现象,
当该命令执行后需要用户按一下回车键才行。

如果配置这样的命令,很有可能导致超时失败。如下图
1
2
3
4
5
6
7SSH: Connecting from host [localhost.localdomain]
SSH: Connecting with configuration [jenkins-testserver] ...
channel stopped
SSH: Disconnecting configuration [jenkins-testserver] ...
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,002 ms]
Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE
Finished: UNSTABLE超时机制:默认超时时间是
120000ms,点击高级可以配置超时时间。
数据流重定向
数据流重定向就是将某个命令执行后应该要出现在屏幕上得数据传输到其他地方。
- 标准输入(stdin):代码0,使用<或<<
- 标准输出(stdout):代码为1,使用>或>>
- 标准错误输出(stderr):代码为2,使用2>或2>>
1 | nohup java -jar /root/xxx.jar >mylog.log 2>&1 & |
2.2.4 git钩子自动构建项目
配置构建触发器中触发远程构建选项,设置身份验证令牌,比如设置成123456,访问链接http://192.168.96.134:8080/job/testProject01/build?token=123456即可触发构建。
但是存在问题,该链接不支持匿名访问,必须登录用户访问此链接才行。
安装插件Build Authorization Token Root,即可使用匿名访问。

安装Build Authorization Token Root插件

插件Build Authorization Token Root文档
Usage
用例是 Jenkins 是安全的,因此匿名用户缺乏整体读取权限。假设您想从脚本触发某些作业的构建。您可以选择经过充分验证的用户并使用该人的 API 令牌 POST 到
job/NAME/build. 但这会将那个人的完全权限授予任何可以看到该脚本的人,这是很危险的。此问题的通常解决方法是在作业配置中定义构建授权令牌,并使用脚本 ping
job/NAME/build?token=SECRET。不幸的是,Jenkins 会按层次结构检查 URI,并且只检查job/NAME/需要身份验证的程度。这个插件提供了一个备用的 URI 模式,它不受通常的整体或作业读取权限的约束。只需发出一个 Http GET 或 POST 到
buildByToken/build?job=NAME&token=SECRET. 无论安全设置如何,匿名用户都可以访问此 URI,因此您只需要正确的令牌。支持文件夹。如果名为 的作业
myJob位于名为 的文件夹myFolder中,NAME则为myFolder/myJob(没有交错job/字符串)。(也支持变体子 URI
buildWithParameters和polling,就像通常的delay查询参数一样。)当构建成功排队时,服务器会回复“201 Created”状态代码。当构建已被安排时,服务器回复“303 See Other”,
Location标头指向计划的构建 URL。没有构建许可的客户READ不应遵循重定向,因为这将导致他们无权查看的页面。要为您的作业创建令牌,请转到作业配置,在构建触发器部分选择远程触发构建。您在此处设置的令牌是您将通过 url 传递的内容。
Examples
使用令牌TacoTuesday触发RevolutionTest作业:
1
buildByToken/build?job=RevolutionTest&token=TacoTuesday
使用令牌 TacoTuesday和参数Type提供的值Mexican触发 RevolutionTest作业:
1
buildByToken/buildWithParameters?job=RevolutionTest&token=TacoTuesday&Type=Mexican
插件安装完成后使用get或post方法访问http://192.168.96.134:8080/buildByToken/build?job=testProject01&token=123456,即可触发构建。

2.3 几种构建触发器
快照依赖构建
当依赖的快照被构建时执行本job
触发远程构建(例如,使用脚本)
远程调用本job的restapi时执行本job
job依赖构建Build after other projects are built
当依赖的job被构建时执行本job

定时构建Build periodically
使用cron表达式定时构建本job
向github提交代码时触发Jenkins自动构建
GitHub-Webhook触发时构建本job
定期检查代码变更Poll SCM
使用cron表达式定时检查代码变更,代码变更则构建本job
2.4 jenkins cron表达式
标准cron表达式http://crontab.guru/
jenkins cron表达式遵循标准cron表达式语法,但是略有不同。
点击?号可以查看具体语法文档说明。

1 |
2.5 配置邮件通知
使用163邮箱。
登录163邮箱打开stmp服务,获取授权码。
1 | TCXHFYWWYFIJLOHBK |

2.5.1 配置Jenkins Location

2.5.2 配置Extended E-mail Notification
没有这个选项,需要安装插件,此选项功能可以自定义触发邮件发送条件。

其中包含更多的配置可以点击?号查看说明。
例如:
自定义邮件模板

2.5.3 配置邮件通知
该邮箱通知是系统级别的,系统出现问题会通过此发送邮件。

发送测试邮件。


2.5.4 项目构建后操作添加邮件提示

项目构建后发送邮件成功:
1 | Email was triggered for: Success |

邮件发送异常处理
报错
jakarta.mail.AuthenticationFailedException: 535 Error: authentication failed
原因在于没有在”系统管理(Manage Jenkins)”的”系统设置(Configure system)”中”Jenkins Location”进行系统管理员邮件地址(System Admin e-mail address)配置;或者配置错误。


报错
Failed messages: com.sun.mail.smtp.SMTPSendFailedException: 554 MI:SPB UserReject 0,smtp7,C8CowABnsSRz+OVYTTvPBA--.59938S2 1491466355,查看发现邮箱被冻结了,被人在新加坡登录发送广告邮件,点击进去解冻即可。

没有收件人列表
控制台输出
1
2An attempt to send an e-mail to empty list of recipients, ignored.
Finished: SUCCESS解决方式:
1、Default Recipients- 通过Manage Jenkins进入Configure System
- 查看Default Recipients这一栏是否填写了收件人
2、Project Recipient List
- 进入具体的Job
- 查看Post-build Actions里有没有添加Editable Email Notification这个功能
- 不要勾选Disable Extended Email Publisher这个选项栏
- 查看Project Recipient List这一栏有没有填写收件人
3、 Recipient List
- 还是进入Editable Email Notification这一栏
- 点击进入右下角Advanced Settings…
- 查看Triggers这一栏有没有设置对应触发条件,比如Failure-Any和Success
- 默认的Developers不会发送给收件人,需要选择Recipient List
三、Jenkins集群配置并发构建
集群化构建可以有效提升构建效率,尤其是团队项目比较多的时候,可以并发在多台机器上执行构建。
打开Manage Nodes and CloudsAdd

新建节点

节点配置内容
- 标签: 标签非常有用,如果我们需要执行在某个机器上构建,以及流水线操作,写脚本等等,也需要引用这个标签进行制定在哪个机器上执行构建job。



添加完成后,可以查看本节点日志

可以查看到Jenkins成功连接到节点后,将remoting.jar拷贝了过去,并启动运行了,所以节点机器不需要安装jenkins,只需要安装Java环境以及job构建需要的环境即可,例如git、maven等等。

成功连接,已同步,可以查看到节点机器的信息。

配置多节点后,项目的general会多出两项配置

四、容器化构建
4.1 容器化构建的三种方式

- 外挂目录,不用重新构建镜像,运行文件存储在宿主机上,映射到docker中运行,每次需要将jar传输到部署服务器并重新启动docker镜像。
- 打包镜像,将jar传输到部署服务器中,在部署服务器中打包jar到docker镜像中,每次需要进行重新打包运行。
- 打包镜像推送私服,在jenkins构建服务器中进行打包推送即可,适合云原生环境。
4.2 外挂目录方式
测试服务器安装docker
https://docs.docker.com/engine/install/centos/
1 | $ sudo yum install -y yum-utils |
在测试服务器执行命令
1 | # 拉取openjdk镜像 |
在jenkins中部署
pre steps中添加执行命令
1 | docker stop demo && docker rm demo |
post step添加如下配置

4.3 打包镜像方式
源代码中添加docker/Dockerfile文件

jenkins添加post steps,传输jar到测试服务器

jenkins添加post steps,传输Dockerfile到测试服务器中,并添加Exec command
1 | docker stop jenkins-springboot |

五、流水线pipeline
流水线既能作为任务的本身,也能作为jenkinsfile。
使用流水线可以让我们的任务从ui手动操作,转换为代码化,像docker的dockerfile一样,从shell命令道配置文件,更适合大型项目,让我们团队其他开发者同时参与进来,同时也可以编辑开发jenkinswebui不能完成的更复杂的构建逻辑,作为开发者可读性也更好。
5.1 pipeline语法
5个必备的组成部分
1 | pipline:整条流水线 |
post,流水线完成后可执行的任务
- always 无论流水线或者阶段的完成状态。
- changed,只有当流水线或者阶段的状态与之前不同
- failure,只有当流水线或者阶段状态为
failure - success,只有当流水线或者阶段状态为
success - unstable,只有当流水线或者阶段状态为
unstable,例如,测试失败 - aborted,只有当流水线或者阶段状态为
aborted,例如,手动取消
agent,可以指定指定节点
label,指定运行job的节点标签
any,不指定,有jenkins分配
示例:
1 | pipeline { |
声明式流水线
好处:
- 更像是在jenkins web ui中的操作
- 可读性比较高
- 可以使用blue ocean自动生成
- 支持语法检查
坏处:
代码逻辑能力比脚本式流水线弱,不能完成特别复杂的任务
脚本式流水线,官方现在不推荐了 grovory 难调试吧
好处:
- 更少的代码和弱规范要求
- 更灵活的自定义代码操作
- 不受约束,可以构建特别复杂的工作流和流水线
坏处
- 读写对编程要求比较高
- 比声明式流水线代码更复杂
5.2 blue ocean可视化界面
安装blue ocean插件

blue ocean插件界面ui



5.3 将4.3打包镜像方式改造成流水线
新建一个名称为jenkins-springboot-pipeline的pipeline任务

填入流水线脚本

1 | pipeline { |
注意:
要使用mvn命令,需要在tools中配置maven [name],其中name为Global Toll Configuration中配置的Maven Name,

tools {
maven "maven3"
}
stage('执行构建') {
steps {
sh 'mvn clean package'
}
}
5.4 片段生成器
点击脚本输入框下方流水线语法即可进入片段生成器

生成git拉取代码

文件传输同样可以使用片段生成器


5.5 使用Jenkinsfile创建多分支流水线的job
这里的多分支指的是不同分支的代码,不是指的逻辑上的分支判断语句。

在blue ocean中也可以创建流水线。


blue ocean似乎有bug,有时候通过其创建不成功,也可以在原生的地方创建,选择多分支流水线

在git仓库中提交Jenkinsfile文件,通过控制不同分支上Jenkinsfile文件内容的不同,而实现多分支构建。

可以看到在不同分支上执行的流水线代码是不一样的
master分支上

test分支上

