Jenkins配置分布式构建环境——添加固定Agent并使用JNLP启动Agent详解

news/2024/11/17 16:16:26/文章来源:https://www.cnblogs.com/zhangmingcheng/p/18356890

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 nullat 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只是技术方式,其核心是:

  1. Slave节点主动运行一个Agent程序与Master建立连接,接收并执行Master传递的Job,然后将结果反馈给Master。
  2. 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"

以下是关于长连接的详细信息:

 

  1. 长连接的建立:

 

    • Agent 启动:当 Jenkins Agent 启动时,它会连接到 Jenkins Master 并建立一个持久的 TCP 连接。这种连接使用 JNLP 协议。
    • 通信保持:这个连接用于传输任务配置、执行步骤、日志信息等。它确保 Jenkins Master 和 Agent 之间的通信可以实时进行。
  1. 通信过程:

    • 实时交互:在任务执行过程中,Agent 会定期向 Jenkins Master 发送任务进度、构建日志和其他状态信息。Master 会接收这些更新,并在 Web 界面中显示实时进展。
    • 指令发送:Jenkins Master 会通过这个长连接向 Agent 发送任务指令和配置更新。
  2. 连接的稳定性:

    • TCP 连接:Jenkins 使用 TCP 连接来维持与 Agent 的长连接。TCP 协议提供了可靠的数据传输,确保数据包的顺序和完整性。
    • 心跳机制:为了保持连接的活跃性,Jenkins Master 和 Agent 通常会使用心跳机制(即定期发送空闲的网络包)来检测连接是否仍然有效。如果连接中断,Master 会尝试重新连接,或者标记 Agent 为离线状态。

(2)主节点调度构建任务,从节点根据标签接收构建任务,并按照主节点的指示执行构建作业,并将构建结果和日志发送回主节点。

(3)主节点将构建结果和日志发布到Jenkins界面上,供用户查看和监控。

5、总结

本文详细讲解了如何在Jenkins中添加固定Agent并使用固定节点运行流水线任务,同时阐述了Jenkins JNLP连接方式的原理。通过本文,您可以更好地理解和优化Jenkins的节点配置和任务管理。

参考:Jenkins 安装 JNLP 节点

参考:jenkins发布多台java jenkins并发构建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/783406.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在项目里快速运行史上最强开源大模型「Llama 3.1」

7月份,Meta正式发布迄今为止最强大的开源模型——Llama 3.1,包含了405B、70B和8B三个版本的模型。 作为开发者,如何在项目里快速运行LLaMa3.1大模型? 今天,我们结合英智未来自己的LLM推理API平台,给大家介绍一套免费实践流程。 免费使用地址:https://cognihub.baystone…

利用Jenkins Pipeline高效部署Kubernetes服务

什么是 Jenkins Pipeline Jenkins Pipeline是一种持续集成和持续交付(CI/CD)的功能,它允许开发者将复杂的构建、测试和部署流程编码为一系列称为“管道”的自动化步骤。这些步骤以Groovy脚本的形式编写,并且可以在Jenkins中可视化管理。Pipeline提供了代码化和可重用的构建…

DRM:清华提出无偏差的新类发现与定位新方法 | CVPR 2024

论文分析了现有的新类别发现和定位(NCDL)方法并确定了核心问题:目标检测器往往偏向已知的目标,忽略未知的目标。为了解决这个问题,论文提出了去偏差区域挖掘(DRM)方法,以互补的方式结合类无关RPN和类感知RPN进行目标定位,利用未标记数据的半监督对比学习来改进表征网络…

城市信息模型:构建未来智慧城市之基底座

在智慧城市的宏大叙事中,城市信息模型(City Information Model, CIM)平台如同城市智能的神经中枢,将数据、空间与技术深度融合,为城市规划、管理、服务、居民生活提供了前所未有的洞察与优化途径。CIM平台的构建不仅是技术的集成,更是智慧城市的灵魂,它以三维可视化、数…

8.10作业

代码:5秒后跳转马哥教育官网 如下:

ALV TABLE-COTROL

1.画屏幕 2.流逻辑CONTROLS gr_9112_control TYPE TABLEVIEW USING SCREEN 9112.PROCESS BEFORE OUTPUT.MODULE status_9112. *处理LOOP从内表读到表控制LOOP WITH CONTROL gr_9112_control.MODULE filltbl1_9112.ENDLOOP.PROCESS AFTER INPUT. *处理LOOP从表控制更新内表LOOP …

Tornado 龙卷风混币原理

项目背景 Tornado(https://tornado.cash/)是以太坊隐私赛道著名的混币项目,其混币技术主要使用了 zk-SNARK 零知识证明。 1、关于 zk-SNARK 零知识证明的原理可以参见 if(DAO) 之前的文章:https://mirror.xyz/0xd05cFA28Eaf8B4eaFD8Cd86d33c6CeD1a1875417/X3qSOjObTknXQ_iG…

java浅拷贝BeanUtils.copyProperties引发的RPC异常

背景 近期参与了一个攻坚项目,前期因为其他流程原因,测试时间已经耽搁了好几天了,本以为已经解决了卡点,后续流程应该顺顺利利的,没想到 人在地铁上,bug从咚咚来~ 没有任何修改的服务接口,抛出异常: java.lang.ClassCastException: java.util.HashMap cannot be cast t…

RSS 源:在信息洪流中找回你的时间掌控权

简单介绍了 RSS 后,那么关键的一步就是建立好自己的 RSS 源了。200.RSS源管理 简单介绍了 RSS 后,那么关键的一步就是建立好自己的 RSS 源了。 并不是所所有平台都会提供 RSS 源,因此我们也没办法直接去订阅。 目前使用 RSS 的难题之一就是 RSS 源的匮乏,是无数人重新拥抱 …

P5431 【模板】模意义下的乘法逆元 2

看到5e6的数据,500ms的时限,\(O(NlogN)\)快速幂直接跑肯定会T掉,那我们就要考虑优化一下式子。 我们令\(s = \prod_{1}^{n}{a[i]}\) ,那我们给第i个式子通分,就为$ \frac{k^i*s/a[i]}{s} $ \(s/a[i]\) 就相当于$ \prod ^{i-1}_{1}{a[i]}* \prod _{i+1}^{n}{a[i]}$ 因此我们只…

IOS UI自动化脚本

1.安装rethinkdb https://rethinkdb.com/docs/install/osx/ 2.安装bunch包错修复setup.py里面的数据,去掉U 3.imp包变成了importlib需要替换import Imp# moduleFile, pathName, desc = imp.find_module(moduleName, [os.path.dirname(modulePath)])# module = imp.load_module…

Cartographer的扫描匹配

cartographer 代码思想解读(1)- 相关匹配cartographer在2016年开源后一直在使用,但是一直未仔细阅读并分析其核心代码结构。目前网上可以找到许多博主对其分析和理解。其cartographer的基本思想可参考他人的 博主博客。本博客主要目的根据其框架思想,将其核心算法进行提取,…