前言
1.Jenkins架构原理回顾
在前面一篇《CI&CD落地实践2-Jenkins环境搭建&常见使用技巧》中,我们介绍了Jenkins的架构原理:
Jenkins是一种典型的Master-Slave主从架构。该架构包括一个Master(主)节点和多个Slave(从)节点。Jenkins的Master-Slave架构提供了可扩展性和灵活性,允许用户添加更多节点来提高Jenkins的处理能力,同时保持构建和管理过程的可靠性。
- Master节点:Jenkins的核心是Master节点,包含Jenkins的核心功能和管理界面,并与所有Slave节点通信,调度和分配作业。主要的作业配置信息,如构建工作流程、触发器和构建器、节点和视图信息,以及连接外部系统的应用程序都存储在Jenkins Master节点中。
- Agent节点:也称slave节点,是通过Jenkins Agent(代理)连接到Master节点的计算机,它们执行来自Master节点的作业并将结果返回给Master节点。
2.为什么要部署分布式环境?
在Jenkins的分布式环境中,有以下几个好处:
- 增加伸缩性:Jenkins的分布式环境中可以添加多个节点,将负载分散到不同的节点上,从而增加伸缩性。如果对Jenkins的使用量有要求,可以先添加一些节点,然后在需要的时候再添加更多节点。
- 提高性能:在集中式环境中,Jenkins会变得拥挤,当多个任务同时运行时,会导致性能下降。在分布式环境中,任务可以在不同的节点上运行,因此可以大大提高性能。
- 支持多种操作系统:Jenkins分布式环境可以在多种操作系统上运行,如Windows,Linux等,在不同的操作系统上运行构建可以更好的测试、验证和分发。
- 更好的可靠性:在一个节点发生故障时,其他节点可以继续运行任务,从而保证每个任务都能成功运行,增加了整个系统的可靠性。
- 更好的安全性:在分布式环境中,不同的节点可以采用不同的方式进行认证和授权,从而大大提高了Jenkins的安全性。
总之,Jenkins分布式环境可以提供更好的性能、伸缩性、可靠性和安全性,使得整个系统更加高效、稳定和安全。
3.分布式环境建设计划
其实驱使我搭建分布式环境倒不是因为伸缩性不足、性能低下等方面的原因,而是我在一次Jenkins配置Maven项目、编译后端springboot项目时,老是报Maven依赖库错误的问题,最终导致编译不过,尝试了很多方法都没有解决。但该项目在我本地的IDEA中是可以正常编译通过的,于是我想了一个曲线救国的方案,就是在另一台Windows机器上,搭建一套和我本机一模一样的环境,将我本机的Maven仓库整体打包复制过去,然后再安装一个Jenkins,作为从节点使用。
当前我只在一个单节点服务器上安装了Jenkins,计划在一台Linux系统机器上安装Jenkins作为从节点1,在另一台Windows系统机器上安装Jenkins作为从节点2。
节点 | 主机 | 系统 | 用途 |
Master 主节点 | 192.168.1.20 | CentOS 7 | 分配、调度任务 |
Slave 从节点1 | 192.168.1.122 | CentOS 7 | 编译前端项目 |
Slave 从节点2 | 192.168.1.188 | Win 10 | 编译后端项目 |
一、添加Linux从节点
1.从节点环境配置
① 从节点安装Jenkins
所在服务器需要安装Jenkins,版本最好与主节点Jenkins版本保持一致,安装步骤参考前面的《Jenkins环境搭建&常见使用技巧》
② 从节点环境配置
需要安装Git以及相关插件,如果是编译前端项目,需要配置nodejs,如果是编译后端项目,还需要安装maven等。前端环境配置可以参考前面的一篇《Jenkins实现前端项目自动化构建》
2.添加从节点
① 创建从节点
入口:系统管理-节点管理-添加节点,填写从节点名称,选择固定节点
② 填写从节点信息
- Number of executors:执行器数量,支持的最大job并发数,一般配置建议不超过当前节点电脑的CPU数量
- 远程工作目录
- 标签:做调度策略时会用到
- 用法:一般选择第一个“Use this node as much as possible”(尽可能的使用这个节点)
- 启动方式:通过Java Web启动代理
注意最后“节点属性”,可以勾选“工具位置”提前指定该机器中的如JDK等工具的路径。
刚添加好后的从节点处于不可用状态,还需要进行一堆的配置:
③ 主节点配置代理
主节点:系统管理-全局安全配置-代理,指定一个代理端口(注意:从节点服务器防火墙一定要开放此端口)
④ 从节点连接主节点
在管理节点点击查看新增的从节点详情,会给出从节点如何连接主节点的提示:
在从节点上执行:
# 下载agent.jar
curl -sO http://192.168.1.20:8080/jenkins/jnlpJars/agent.jar
# 连接主节点
java -jar agent.jar -jnlpUrl http://192.168.1.20:8080/jenkins/manage/computer/h122/jenkins-agent.jnlp -secret 5d40fefd1148aa3e1461eb53a7764f655c030a7859cfa648b2340ba019146a3d -workDir "/home/jenkins/workspace"
此时我的报错了,提示42730端口不可用,也就是前面提到的从节点服务器防火墙一定要开放主节点中配置的代理端口
防火墙开通端口号
firewall-cmd --permanent --add-port 42730/tcp
firewall-cmd --reload
再次执行连接命令后,连接成功
但是这种启动方式会一直处于前台运行,此时终端窗口无法再进行其他操作。因此,可以给它创建一个启动脚本,使其后台运行。
⑤ 创建启动脚本
脚本内容如下:
nohup java -jar agent.jar -jnlpUrl http://192.168.1.20:8080/jenkins/manage/computer/h122/jenkins-agent.jnlp -secret 5d40fefd1148aa3e1461eb53a7764f655c030a7859cfa648b2340ba019146a3d -workDir "/home/jenkins/workspace" 2>&1 >nohup.out &
运行脚本
chmod +x start_agent.sh
./start_agent.sh
3.测试构建项目
在前面一篇《Jenkins实现前端项目自动化构建》中,已经在主节点成功构建运行了前端项目,此时我们再次构建该项目,看看它会不会在从节点运行。
当我点击构建时,该项目确实是通过我新建的从节点"h122"执行构建的
但出现了报错"No such file or directory",提示项目路径不存在:
项目构建报错问题排查
- 项目的配置:
- 控制台输出日志:
- 原本在master节点上运行时生成的工作目录路径:
- 转到slave从节点上运行时生成的工作目录路径:
经过一番排查,终于找到了原因:
- 此项目原本是在主节点运行,我在主节点配置这个任务时,项目的路径是写死的:/home/jenkins/workspace/开普勒-前端,在主节点运行时确实有这个路径,也能够正常运行;
- 但是我在配置从节点时设置的远程工作目录是:/home/jenkins/workspace,当从节点首次构建项目时,也会生成一个workspace目录,并在这个workspace目录下创建以项目名称“开普勒-前端”为名字的工作目录,最后叠加在一起,从节点上该项目真正的工作目录就是 /home/jenkins/workspace/workspace/开普勒-前端。而此时从节点匹配不到原本的"/home/jenkins/workspace/开普勒-前端"这个目录,所以运行失败。
项目构建报错问题解决
解决方式有两种:
- 一种是修改从节点配置,将远程工作目录路径去掉一层workspace目录;
- 第二种是通过全局变量$WORKSPACE来声明工作目录;
全局变量
我用的是第二种,将构建步骤中原本的"cd /home/jenkins/workspace/开普勒-前端"改为"cd $WORKSPACE"
再次构建,构建成功!
企微群也收到了构建成功的消息通知:
二、添加Windows从节点
1.从节点环境配置
① 从节点安装Jenkins
同样是需要先在Windows电脑上提前安装好Jenkins。
② 从节点环境配置
同样需要安装JDK、Git以及相关插件,如果是编译前端项目,需要配置nodejs,如果是编译后端项目,还需要安装maven等。
2.添加从节点
① 创建从节点
入口:系统管理-节点管理-添加节点,填写从节点名称,选择固定节点
② 填写从节点信息
同样选择“通过Java Web启动代理”
在管理节点点击查看新增的从节点详情,会给出从节点如何连接主节点的提示:
③ 从节点连接主节点
在从节点上执行:
curl -sO http://192.168.1.20:8080/jenkins/jnlpJars/agent.jar
java -jar agent.jar -jnlpUrl http://192.168.1.20:8080/jenkins/manage/computer/win188/jenkins-agent.jnlp -secret ed74e189c3cf7012fac65f0c9af7e091a1159d36ebbef8c581491fccff40a1b5 -workDir "C:\Users\chenjigang\.jenkins"
连接成功:
此时会在我们配置的自定义工作目录下自动创建生成remoting内部数据目录
创建完成,从节点win188处于在线状态:
3.指定项目运行节点
配置Jenkins项目
比如我想为某个项目指定用这个从节点win188来运行,那么则可以在该项目配置-General中勾选“限制项目的运行节点”,并填写标签表达式,也就是前面我们填写从节点时设置的标签名称“win188”
构建该项目,可以看到,已经通过win188这个从节点来运行:
报错问题解决
但是在运行的时候报错了,提示maven路径不存在,原因是此项目原本是在主节点(Linux)上运行的,该台机器上的maven目录是/home/apache-maven-3.6.3,而换到了从节点(Windows)系统运行以后,maven路径不一致。
需要在win188从节点配置中指定相关工具位置:
再次运行,构建成功:
小结
以上就是Jenkins分别添加Linux从节点、Windows从节点以及构建过程中出现报错问题排查解决的全部过程。总体来说,不管Linux从节点还是Windows从节点,步骤基本一致。关键的是如何合理利用好这些节点,从而物尽其用,使其发挥出更大价值!