Jenkins实现CICD之实现分布式代理功能

                                              作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.配置Jenkins执行者数量

1.执行者数量概述

如上图所示,Jenkins默认仅支持2个执行者数量,很明显,并行度为2的话,对于一个高度CICD的场景并不太合适,生成环境建议调大。


2.配置Jenkins的执行者数量

2.1 进入到系统配置界面

如上图所示,我们可以进入到系统配置界面。

2.2 调大执行者数量

如上图所示,我们调大执行者数量。这个调优参数建议等于CPU核心数或者是CPU核心数的2倍是一个比较理想的值。

2.3 验证执行者数量

如上图所示,当我们调大执行者数量后,不难发现,构建执行者状态会发生变化哟!

二.Jenkins分布式架构相关概念

1.Jenkins分布式架构

如上图所示,Jenkins分布式即将Jenkins的任务进行分布式处理。

在众多Job的场景下,单台Jenkins Master同时执行clone,编译,打包及构建,其性能可能会出现瓶颈从而影响代码部署效率。

Jenkins官方提供了Jenkins分布式构建,将众多job分散运行到不同的Jenkinsslave节点,大幅度提供并行job的处理能力。

除此之外,还可以针对不同的开发环境分配至不同的slave实现编译部署。比如: Java程序分配至slave1,Go程序的编译分配给slave2,Nodejs程序分配给slave3等等。

在Jenkins中,节点是一个基础概念,代表了任何可以执行Jenkins任务的系统。

采用master/agent架构,因而节点可划分主节点(master)和代理节点(agent)两种类型,代理节点也称为从节点(slave)。

主节点负责提供UI,处理HTTP请求及管理构建等,而代理节点主要负责执行构建任务。
	- 主节点(master):
		Jenkins的一个部署实例的核心控制系统,它能够完全访问所有Jenkins配置的选项和任务(Job)列表。
		而且,若不存在其他代理节点,主节点也是默认的任务执行节点。
		
	- 代理节点(agent/slave):
		在早期版本的Jenkins中,代理节点(agent)也被称为从节点(slave),它代表着所有的非主节点。
		这类节点由主节点管理,按需分配或指定特定的任务,例如不同的构建任务或测试。
		脚本式流水线中,节点特指一个运行代理节点的系统,而在声明式流水线中,它则是分配的一个作为代理的特定节点。
		
	- 执行器(Executor):
		简单来说,Executor只是节点或代理节点用于执行任务的第一个槽位。
		Executor的数量定义了该节点可以执行的并发任务量,一个节点上可以有任务数量的槽位,但也允许管理员按节点资源定义合适的数量。
		在主节点将任务分配给特定节点时,该节点上必须有可用的Executor来立即执行该任务,否则,只能得到有空闲槽位可用。

2.节点标签

Jenkins中的标签(Tag)指的是节点上的标识符,而后可由pipline中agent指令等进行过滤和选择节点执行。

当Agent节点较多时,基于方便管理的目的,通常应该给这些节点添加能够体现其某种特性或功能的标签,以便于在构建任务中能基于标签过滤出符合条件的agent来。

一个agent上可添加多个标签,一个标签也可以添加至多个Agent。

标签名称不允许使用空白字符,也不允许使用标签表达式中预留的关键字,例如: "!""&""|""<"">"")"""("等。


常见的标签经纬度有如下几个:
	- 操作系统类型: Linux,Windows,MacOS
	- 操作系统位数: 32bit,64bit
	- 集成的工具链: jdk,Go,Python,Nodejs等

三.部署Jenkins分布式实战

1.环境准备

主机名 角色 备注
jenkins12.oldboyedu.com master
jenkins31.oldboyedu.com slave
jenkins32.oldboyedu.com slave
如上表所示,分别对应Jenkins分布式集群的主机名规划。

2.在2个slave节点的操作

2.1 安装jdk环境

root@jenkins31:~# apt update && apt -y install openjdk-11-jdk-headless

root@jenkins32:~# apt update && apt -y install openjdk-11-jdk-headless

2.2 如果需要执行特定任务,还需要安装相关工具

root@jenkins31:~# apt -y install git maven golang ansible

root@jenkins32:~# apt -y install git maven golang ansible

2.3 配置名称解析要和master一致

vim /etc/hosts
...

# 以下的解析必须和master解析一致即可,可以直接从master节点将/etc/hosts拷贝过来即可。
10.0.0.12 jenkins12.yinzhengjie.com
10.0.0.11 gitlab11.yinzhengjie.com   www.yinzhengjie.com

2.4 生成ssh key,并复制公钥到gitlab的相关联的用户

略,自行配置即可。

2.5 如果有需要和其他ssh服务器链接,还需要复制公钥到其他节点

略,自行配置即可。

3.Jenkins安装SSH Build Agents 插件

3.1 进入到插件管理界面

如上图所示,进入插件管理界面。

如下图所示,搜索插件"SSH Build Agents"插件。

3.2 安装插件成功

如上图所示,安装后可以我们重启下Jenkins,使之生效。

4.Jenkins的master节点添加slave1节点

4.1 进入节点管理界面

如上图所示,依次点击即可进入到节点管理界面,如下图所示。

4.2 新建节点

如上图所示,我们可以点击"新建节点"。


如下图所示,我们可以为新建节点设置名称,并选择"固定节点",点击"Create"按钮。

4.3 配置slave1节点

如上,下图所示,按照需求配置即可。


控制Jenkins如何在这台机器上安排构建.
	- 尽可能的使用这个节点
		这是默认和常用的设置. 在这种模式下,Jenkins会尽可能的使用这个节点.任何时候如果一个构建能使用这个节点构建,那么Jenkins就会使用它.
	- 只允许运行绑定到这台机器的Job
		这种模式下,Jenkins只会构建哪些分配到这台机器的Job. 这允许一个节点专门保留给某种类型的Job.例如,在Jenkins上连续的执行测试,你可以设置执行者数量为1,那么同一时间就只会有一个构建, 一个实行者不会阻止其它构建,其它构建会在另外的节点运行.

4.4 查看slave1节点信息

如上图所示,我们可以查看slave1节点的系统信息。

如下图所示,不难发现,slave1节点已经部署成功啦,其会在slav1节点部署一个名为"remoting.jar"jar包哟。

4.5 查看slave1日志

如上图所示,可以查看连接slave1的过程哟~

5.Jenkins的master节点添加slave2

5.1 添加新节点

如上图所示,输入节点名称,选择类型为"slave1",我们基于现有的配置即可快速创建slave2啦。

5.2 配置salve2节点

如上图所示,我们仅需要修改和slave1不同的位置即可。

5.3 查看节点列表

如上图所示,我们成功将3个节点都按照好啦,到此,说明咱们的Jenkins集群就搭建完成啦。

6.创建测试任务,验证Jenkins分布式环境

6.1 创建一个自由风格的任务

如上图所示,创建一个自由风格的任务即可。

6.2 配置Jenkins任务

如上图所示,点击"限制项目的运行节点",配置运行项目所在的节点标签。

如下图所示,定义该项目执行的测试shell。

6.3 查看控制台输出

如上图所示,点击"立即构建"即可。

如下图所示,不难发现,咱们的任务的确是在"java"标签的节点上运行的哟!

7.Jenkins利用分布式代理执行Java项目

7.1.新建项目

如上图所示,创建一个自由风格的项目。

7.2 配置源码

如上图所示,配置项目的源码目录。

7.3 选择slave节点部署

如上图所示,我们可以选择一台slave节点来部署,这个java标签就是我之前配置的slave1节点哟!即jenkins31节点

7.4 Jenkins调用部署脚本

如上图所示,配置Jenkins调用部署Java程序的脚本。

脚本内容如下:
[root@ubuntu12.yinzhengjie.com ~]# cat /yinzhengjie/script/jenkins/spring-boot-helloWorld-deploy-job.sh 
#!/bin/bash

# 指定需要部署的主机列表
HOST_LIST="
10.0.0.13
10.0.0.14
"

# 指定部署服务的目录
DEPLOY_TARGET_DIR=/yinzhengjie/softwares/javaApp

# 编译Java项目为jar包
mvn clean package -Dmaven.test.skip=true

# 直接使用Java部署jar包即可。
for host in $HOST_LIST;do
    ssh $host "pgrep java && killall -9 java || true "
    ssh $host "mkdir -pv ${DEPLOY_TARGET_DIR}"
    scp target/spring-boot-helloworld-*.jar $host:${DEPLOY_TARGET_DIR}
    ssh $host "nohup java -jar  ${DEPLOY_TARGET_DIR}/spring-boot-helloworld-*.jar --server.port=8888  &>/dev/null" &
done
[root@ubuntu12.yinzhengjie.com ~]# 

7.5 同步master和slave环境确认

- 将Jenkins分布式节点的秘钥配置和gitlab免密登录
	(1)方式一:
		此步骤我们可以在slaves节点上注意生成秘钥,并在gitlab的页面上添加相应节点的秘钥即可。

	(2)方式二:
		当然,我们也可以直接将Jenkins的master节点的秘钥直接复制到slaves节点,以达到复用的效果,如下所示:
[root@ubuntu12.yinzhengjie.com ~]# scp -rp /root/.ssh/ 10.0.0.31:~
[root@ubuntu12.yinzhengjie.com ~]# 
[root@ubuntu12.yinzhengjie.com ~]# scp -rp /root/.ssh/ 10.0.0.32:~




- 同步脚本文件
	注意,上述配置我们在master节点,为了上salve节点都有配置,我们还需要配置master节点和slave节点的脚本目录应该是同步的哟。
	我这里就偷懒了,直接将master节点的脚本直接拷贝到slave节点即可。
[root@ubuntu12.yinzhengjie.com ~]# scp -r /yinzhengjie/ 10.0.0.31:/
[root@ubuntu12.yinzhengjie.com ~]# scp -r /yinzhengjie/ 10.0.0.32:/



- 同步maven加速
[root@ubuntu12.yinzhengjie.com ~]# scp /etc/maven/settings.xml 10.0.0.31:/etc/maven/
[root@ubuntu12.yinzhengjie.com ~]# scp /etc/maven/settings.xml 10.0.0.32:/etc/maven/

7.6 立即构建任务并验证

如上图所示,我们理解构建任务,不难发现已经构建成功啦。
posted @   尹正杰  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 2025年广告第一单,试试这款永久免费的开源BI工具
· 为什么 .NET8线程池 容易引发线程饥饿
· 在 .NET 中使用 Tesseract 识别图片文字
· 场景题:假设有40亿QQ号,但只有1G内存,如何实现去重?
· BotSharp:又一个.Net重磅AI开源项目,.Net在AI领域开始崛起!
历史上的今天:
2020-12-16 JavaScript基础知识-this
2019-12-16 Linux操作系统的压缩、解压缩工具介绍
2019-12-16 Nginx高级配置-压缩功能
2019-12-16 Nginx高级配置-自定义json格式日志
2018-12-16 在Mac OS环境下安装MySQL服务
点击右上角即可分享
微信分享提示