Jenkins配置分布式构建环境——添加固定Agent并使用JNLP启动Agent详解
1、概述
在《Jenkins部署架构概述》这篇博文中对Jenkins部署架构进行了讲解。对于分布式架构,Jenkins包括固态Agent和动态Agent两种方案。
- 固定Agent(常用于虚拟机):Agent容器一直运行,任务构建完成后不会销毁,创建完成后将一直占用集群资源,配置过程较简单。
- 动态Agent(常用于K8s):构建任务时动态创建Agent容器,并在任务构建完成后销毁容器,可实现资源动态分配,资源利用率高,但是配置过程较为复杂。
本文将对Jenkins添加固定Agent进行详细讲解。
2、Jenkins添加固定Agent
(1)登录Jenkins Dashboard,单击左侧“Manage Jenkins”,选择“Security→代理配置页面(TCP port for JNLP)”,如图所示。我们可以选择开放固定端口或者随机开放Jenkins Master的一个端口来提供JNLP服务。

新安装完的Jenkins Master节点上面的代理默认是禁用状态, 如果这里不开启代理,后面添加JNLP连接模式的固定节点时会以下报错。
java.io.IOException: http://10.20.31.153:8080/jenkins/tcpSlaveAgentListener/ is invalid: 404 null
at org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.resolve(JnlpAgentEndpointResolver.java:222)
at hudson.remoting.Engine.innerRun(Engine.java:809)
at hudson.remoting.Engine.run(Engine.java:563)
(2)单击左侧“Manage Jenkins”,选择“Nodes”。

(3)单击页面右上角的“New Node”,输入节点名称为node203(该名称可自定义),类型选择固定节点。

配置以下节点信息:
- Name:agent名称。
- Number of executors(并发构建的最大数目):执行器,是真正执行项目的单元,默认值是1。一个执行器可以被理解为一个单独的进程(事实上是线程)。在一个节点上可以运行多个执行器。
- Remote root directory(远程工作目录): agent机器上的工作目录,使用绝对路径。
- Labels:agent的标签。当agent数量变多时,如何知道哪些agent支持JDK 8、哪些agent支持Node.js环境呢?我们可以通过给agent打标签(有时也称为tag)来确定。同一个agent可以拥有多个标签。
- Usage:agent的使用策略,有两种:
- Use this node as much as possible,尽可能使用此agent。
- Only build jobs with label expressions matching this node,只有当构建任务符合本agent的标签时,才使用此agent。
- Launch method(启动方式),有两种:
- Launch agent by connecting it to the controller,通过Java Web启动代理(JNLP,跨平台,但是必须提前在固定节点安装配置JRE环境,最常用方式)。
- Launch agent via SSH,Jenkins Master通过SSH连接到固定Agent(此方式比较简单,但是不能跨平台,用的较少)。
其余参数可保持默认,无需填写,并单击“保存”。

(4)在“节点列表”中单击新增的节点名称,可看到Agent状态未连接,并提供了节点连接Jenkins的方式。

(5)在固定Agent节点上,打开命令终端,运行Master提示的命令。

注意 1:Agent节点需要提前安装好与Jenkins版本匹配的JRE,不然报has been compiled by a more recent version of the Java Runtime(class file version 5x.0)错误。其中5x:51=Jdk7、52=Jdk8、53=Jdk9、54=Jdk10、55=Jdk11,以此延续。
注意 2:SSH和JNLP2种启动方式区别,主要核心区别是:
- SSH是Master主动连接Slave,当你在Master配好了一台机器的账密,那么Master就可以通过账密SSH到这台机器执行命令,所以
SSH是Master主动连接Slave。- JNLP是Slave主动连接Master,Slave接收并执行Master传递的Job,然后将结果反馈给Master。
(6)在Jenkins Master“节点列表”中单击新增的节点名称,可看到Agent状态已连接,下面就可以使用固定节点构建流水线任务了。

3、使用固定Agent执行流水线任务
(1)新建个流水线,Pipeline如下。
pipeline {
agent {
node {
label 'node203'
}
}
stages {
stage('test node203') {
steps {
echo '使用node203执行流水线'
sh 'sleep 1h'
}
}
}
}

(2)运行流水线,再次查看node203节点状态,可以看到正在执行流水线分配(通过标签匹配)到当前节点的流水线任务。

注意 1:上面示例只是个Hello World,如果流水线里面需要执行mvn命令,需要在固定节点安装配置指定版本的mvn,如果流水线需要执行npm命令,需要在固定节点安装配置指定版本的nodejs.....。
4、Jenkins使用JNLP启动Agent原理详解
4.1 概述
Java网络启动协议(JNLP)是一种允许客户端启动托管在远程Web服务器上的应用程序的协议,用于在Java应用程序之间建立安全、高效的通信。
JNLP只是技术方式,其核心是:
- Slave节点主动运行一个
Agent程序与Master建立连接,接收并执行Master传递的Job,然后将结果反馈给Master。 - Master通过JNLP协议与从节点进行通信,将构建任务分发到Slave节点执行。
4.2 为什么使用 JNLP 协议
- 自动化:JNLP 协议允许 Jenkins Master 和 Agent 之间的连接和配置过程自动化,而不需要手动干预。Agent 启动时自动处理与 Master 的连接和认证,简化了配置过程。
- 安全性:JNLP 协议中的认证机制可以确保只有授权的 Agent 可以连接到 Jenkins Master,从而提高了系统的安全性。
- 动态更新:JNLP 文件可以包含最新的配置信息,这使得 Agent 可以在启动时动态地获取和使用这些信息。
4.3 Master节点和Slave节点之间的通信过程
(1)从节点通过JNLP协议与主节点建立TCP/IP长连接,这个长连接的机制允许Jenkins Master和Agent之间保持持续的通信,以便实时地进行任务调度、执行和状态更新。
java -jar agent.jar -url http://10.20.31.153:8080/jenkins/ -secret 800b585576416c0041ed6ee9783f895118193e443309a2d557cfb319b057a8a9 -name node203 -workDir "/opt/jenkins"
以下是关于长连接的详细信息:
- 长连接的建立:
- Agent 启动:当 Jenkins Agent 启动时,它会连接到 Jenkins Master 并建立一个持久的 TCP 连接。这种连接使用 JNLP 协议。
- 通信保持:这个连接用于传输任务配置、执行步骤、日志信息等。它确保 Jenkins Master 和 Agent 之间的通信可以实时进行。
通信过程:
- 实时交互:在任务执行过程中,Agent 会定期向 Jenkins Master 发送任务进度、构建日志和其他状态信息。Master 会接收这些更新,并在 Web 界面中显示实时进展。
- 指令发送:Jenkins Master 会通过这个长连接向 Agent 发送任务指令和配置更新。
连接的稳定性:
- TCP 连接:Jenkins 使用 TCP 连接来维持与 Agent 的长连接。TCP 协议提供了可靠的数据传输,确保数据包的顺序和完整性。
- 心跳机制:为了保持连接的活跃性,Jenkins Master 和 Agent 通常会使用心跳机制(即定期发送空闲的网络包)来检测连接是否仍然有效。如果连接中断,Master 会尝试重新连接,或者标记 Agent 为离线状态。
(2)主节点调度构建任务,从节点根据标签接收构建任务,并按照主节点的指示执行构建作业,并将构建结果和日志发送回主节点。
(3)主节点将构建结果和日志发布到Jenkins界面上,供用户查看和监控。
5、总结
本文详细讲解了如何在Jenkins中添加固定Agent并使用固定节点运行流水线任务,同时阐述了Jenkins JNLP连接方式的原理。通过本文,您可以更好地理解和优化Jenkins的节点配置和任务管理。
参考:jenkins发布多台java jenkins并发构建
Jenkins配置分布式构建环境——添加固定Agent并使用JNLP启动Agent详解的更多相关文章
- Jenkins配置自动化构建
转自: http://blog.sina.com.cn/s/articlelist_3053349671_14_1.html Jenkins 简介和安装(一) (2014-12-02 21:18:13 ...
- 【原创】K8S环境下研发如何本地调试?kt-connect使用详解
K8S环境下研发如何本地调试?kt-connect使用详解 背景 注:背景有点啰嗦,讲讲一路走来研发本地调试的变化,嫌烦的可以直接跳过,不影响阅读. 2019年 我在的公司当时是个什么情况,只有两个J ...
- fabric网络环境启动过程详解
这篇文章对fabric的网络环境启动过程进行讲解,也就是我们上节讲到的启动测试fabric网络环境时运行network_setup.sh这个文件的执行流程 fabric网络环境启动过程详解 上一节我们 ...
- Hadoop自学笔记(五)配置分布式Hadoop环境
上一课讲了怎样在一台机器上建立Hadoop环境.我们仅仅配置了一个NHName Node, 这个Name Node里面包括了我们全部Hadoop的东西.包括Name Node, Secondary N ...
- Docker 搭建 Jenkins 持续集成自动化构建环境
1.Docker镜像拉取 Jenkins 环境命令 docker pull jenkins/jenkins:lts 查看下拉取的镜像 docker images 2.通过容器编排方式构建 Jenkin ...
- 【Devops】【docker】【CI/CD】关于jenkins构建成功后一步,执行的shell命令详解+jenkins容器运行宿主机shell命令的实现方法
1.展示这段shell命令 +详解 #================================================================================= ...
- 用Jenkins配置自动化构建
公司培训内容 -------------->记一笔 dubbo 微服务soadiamond-server 配置中心kafka rocketmq消息队列cas-server 单点登录spring ...
- Jenkins配置项目构建后的钉钉通知
首先在任意一个钉钉群里创建自定义的钉钉机器人,然后能够看到钉钉开放的webhook 复制webhook Jenkins中安装钉钉插件,然后在项目的配置当中,构建后操作里添加钉钉报警 url一般默认已经 ...
- Jenkins配置项目构建的钉钉通知
在任意一个钉钉群里创建自定义的钉钉机器人,然后能够看到钉钉开放的webhook,复制webhook. Jenkins中安装钉钉插件,然后在项目的配置当中,构建后操作里添加钉钉报警. 安装钉钉通知插件 ...
- 使用Jenkins配置自动化构建
持续集成是个简单重复劳动,人来操作费时费力,使用自动化构建工具完成是最好不过的了. 为了实现这个要求,我选择了Jenkins. 从http://mirrors.jenkins-ci.org/windo ...
随机推荐
- JSON文件存储
JSON 文件存储 JSON,全称为 JavaScript Object Notation, 也就是 JavaScript 对象标记,通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一 ...
- windows离线部署VSCode在Centos7上的远程开发环境
前言 公司一直使用的是ssh+vim的远程开发方式,习惯了vim之后已经非常方便了.但是还是想尝试一下VSCode的开发方式.就我而言,原因如下 漂亮的语法高亮,并且有补全 基于语法解析的引用查找(尽 ...
- 【读论文】CM-Gen: A Neural Framework for Chinese Metaphor Generation with Explicit Context Modelling
为了更好的阅读体验,请点击这里 由于发不出论文,所以找点冷门方向做一做.从汉语比喻开始. 读完这篇论文之后我觉得 COLING 这方向我上我也行(ε=ε=ε=┏(゜ロ゜;)┛ 题目:CM-Gen: A ...
- 鸿蒙生态伙伴SDK市场正式发布,驱动千行百业鸿蒙原生应用开发
6月21-23日,华为开发者大会(HDC 2024)在东莞举办.在22日举办的[鸿蒙生态伙伴SDK]论坛中,正式发布了[鸿蒙生态伙伴SDK市场](以下简称:伙伴SDK市场),伙伴SDK市场是为开发者提 ...
- STM32 CubeMX 学习:004-PWM
背景 上一讲,我们介绍了 STM32 CubeMX 学习:定时器 ,并示范了如何使用定时器来定时.这一讲我们来试试PWM(Pulse Width Modulation, 脉冲宽度调制),这是利用微处理 ...
- WPF网格类型像素着色器
由于WPF只能写像素着色器,没法写顶点着色器,所以只能在这上面做文章了 刚好有个纹理坐标TEXCOORD输入可用,而且值的范围是已知的0-1,左上角是原点,这就好办了 例子 索引 二分网格 使用cei ...
- 3.8折钜惠,瑞芯微RK3568J国产工业评估板“限时折扣”!
- SD中的VAE,你不能不懂
什么是VAE? VAE,即变分自编码器(Variational Autoencoder),是一种生成模型,它通过学习输入数据的潜在表示来重构输入数据. 在Stable Diffusion 1.4 或 ...
- Window版 MySQL可视化工具 Navicat 面安装免激活绿色版
网盘地址 链接:https://pan.baidu.com/s/1T0WyhGAFEt28GaU4wXhfrg 提取码:z4ww navicat15破解版 链接:https://pan.baidu.c ...
- yb课堂 搭建node环境和npm安装 《二十六》
搭建node环境和npm安装 什么是NodeJS? Node.js就是运行在服务端得JavaScript 什么是npm? nodejs的包管理工具,可以下载使用公共仓库的包,类似maven包安装分为本 ...