Jenkins分布式构建与并行构建
Jenkins分布式构建与并行构建
jenkins的架构
Jenkins采用的是“master+agent(slave)”架构。Jenkins master负责提供界面、处理HTTP请求及管理构建环境;构建的执行则由Jenkins agent负责
Jenkins agent的横向扩容:只需要增加agent就可以轻松支持更多的项目同时执行

• node:节点,指包含Jenkins环境及有能力执行项目的机器。master和agent都被认为是节点。
• executor:执行器,是真正执行项目的单元。一个执行器可以被理解为一个单独的进程(事实上是线程)。在一个节点上可以运行多个执行器。
• agent:代理,在概念上指的是相对于Jenkins master的一种角色,实际上是指运行在机器或容器中的一个程序,它会连接上Jenkins master,并执行Jenkins master分配给它的任务。
增加agent支持并行构建
Jenkins agent作为一个负责执行任务的程序,它需要与Jenkins master建立双向连接。连接方式有多种,这也代表有多种增加agent的方式。
标签是什么
当agent数量变多时,如何知道哪些agent支持JDK 8、哪些agent支持Node.js环境呢?我们可以通过给agent打标签(有时也称为tag)来确定。
同一个agent可以拥有多个标签。在标签名中不能包含空格,也不能包含!、&、|、<、>、(、)这些特殊字符中的任何一个。因为包含特殊字符的标签名与标签表达式(用于过滤agent)冲突。
通过JNLP协议增加agent
Java网络启动协议(JNLP)是一种允许客户端启动托管在远程Web服务器上的应用程序的协议。Jenkins master与agent通过JNLP协议进行通信。而Java Web Start(JWS)可以被理解为JNLP协议的一个客户端。
(1)进入Manage Jenkins→Global Security→TCP port for JNLP配置页面,如图所示。我们可以选择开放固定端口或者随机开放Jenkins master的一个端口来提供JNLP服务。

随机开放端口不利于自动化,所以选择开放固定端口。此端口用于master与agent之间的TCP通信,与访问Jenkins界面时的端口有别。
(2)进入Manage Jenkins→Manage Nodes→New Node页面,如图所示。选项“Permanent Agent”指的是常驻代理客户端。

单击“OK”按钮后,进入node配置页面

• Name:agent名称。
• Remote root directory:agent机器上的工作目录(Jenkins master不关心),使用绝对路径。
• Labels:agent的标签。
• Usage:agent的使用策略。有两种:
 ◦ Use this node as much as possible,尽可能使用此agent。
 ◦ Only build jobs with label expressions matching this node,只有当构建任务符合本agent的标签时,才使用此agent。
• Launch method:agent的运行方式。JNLP协议的agent选择“Launch agent via Java WebStart”。配置完成后进入节点列表页面,此时master节点的状态显示是在线的,即可用的

当节点不可用时,如node1节点,Jenkins master不再分配任务给它

(3)单击节点列表中的node1,跳转到“Agent node1”页面,显示详情如图所示。
JNLP协议agent连接Jenkins master还有3种方式。一是在agent机器的浏览器中打开此页面,单击“Launch”按钮。二是通过javaws命令从master节点下载Java Web Start程序。三是无界面方式连接。第3种方式不需要界面操作,我们毫不犹豫地选择它,因为只有这样才方便自动化。

(4)SSH登录到Jenkins agent机器,下载agent.jar文件(JNLP协议的客户端),下载路径为:<Jenkins master地址>/jenkins/jnlpJars/agent.jar。假设这台机器已经安装好JDK,则执行命令:java-jar agent.jar-jnlpUrl http://192.168.23.11:8667/jenkins/computer/node1/slave-agent.jnlp-workDir "/app"。其中-workDir参数用于指定agent的工作目录。当命令提示连接成功后,我们打开Jenkins master页面,查看node1的详情页,如图所示,表示已经连接成功。

agent与master之间的连接过程没有任何权限控制。这是因为我们没有设置Jenkins的安全控制(默认Jenkins向匿名用户开放所有权限)。当设置了安全控制后,新建node,我们将在node的详情页看到连接master的命令就变成了:

其中-secret******就是agent与master之间的连接凭证。每一个JNLP客户端的凭证都不一样。
提示:升级Jenkins后,也需要重新下载agent.jar。agent.jar需要与Jenkins master同步升级。
最后,我们看到通过JNLP协议增加agent的方式是需要在Jenkins界面上进行手动操作的(增加节点的操作)。这部分是无法自动化的,因此,我们只在以下场景中使用这种方式。
• 在安全性要求相对较高的情况下,只能手动增加agent。
• 增加Windows agent。
通过Swarm插件增加agent
Swarm插件只需要启动Swarm客户端(指定Jenkins master地址),master与agent就会自动建立连接。
(1)安装Swarm插件。
(2)确保Jenkins agent机器上安装有JDK。
(3)在Jenkins agent机器上下载Swarm客户端
(4)在Jenkins agent上启动swarm-client连接服务器端。

当日志显示连接成功后,在节点列表页面可以看到Swarm客户端连接成功

swarm-client部分参数的介绍。
•-deleteExistingClients:如果Jenkins master上已经存在同名的node,则先删除。(慎用)
•-description:描述。
•-disableClientsUniqueId:默认Swarm会在node名称后加上一个唯一ID。加上此参数后,代表取消加上唯一ID。
•-disableSslVerification:取消SSL校验。
•-executors N:设置executor的个数。
•-labels VAL:分配给agent的标签,如果有多个,则使用空格分隔。注意,这是给agent打标签。
•-master VAL:指定Jenkins master的URL。
•-mode MODE:Jenkins master分配项目给agent时使用的格式,即有两种格式,即normal(尽可能分配job)和exclusive(当与指定label匹配时才分配项目)。
•-username VAL:连接时使用的用户名。
•-password VAL:连接时使用的密码。不推荐使用。
•-passwordEnvVariable VAL:从环境变量中读取密码。推荐使用。
•-passwordFile VAL:从文本文件中读取密码。推荐使用。
•-retry N:最大重连次数,默认无次数限制。
•-retryInterval N:每次重连间隔时长,单位为秒。默认值为10秒。
agent部分详解
如何在pipeline中使用标签呢
agent部分描述的是整个pipeline或在特定阶段执行任务时所在的agent。换句话说,Jenkinsmaster根据此agent部分决定将任务分配到哪个agent上执行。agent部分必须在pipeline块内的顶层定义,而stage块内的定义是可选的。

agent any告诉Jenkins master任何可用的agent都可以执行。
agent部分的定义可以放在阶段中,用于指定该stage执行时的agent。

注意:pipeline块内的agent部分是必需的,不能省略。
通过标签指定agent:
当pipeline需要在JDK 8环境下进行构建时,就需要通过标签来指定agent。代码如下:

有些构建任务是需要在JDK 8及Windows环境下执行的。也就是说,我们需要过滤同时具有windows和jdk8标签的agent。

上文中,在增加agent时,已经配置好了该agent上的默认工作目录路径,但是agent部分允许我们对工作目录进行自定义。node除了label选项,还提供了另一个选项——customWorkspace,自定义工作目录,写法如下:

customWorkspace选项除了写绝对路径,还可以写相对于默认工作目录路径的相对路径。
不分配节点 : agent none
when指令的beforeAgent选项 :
在默认情况下,阶段内所有的代码都将在指定的Jenkins agent上执行。when指令提供了一个beforeAgent选项,当它的值为true时,只有符合when条件时才会进入该Jenkins agent。这样就可以避免没有必要的工作空间的分配,也就不需要等待可用的Jenkins agent了。在某些场景下,beforeAgent选项通常用于加速pipeline的执行。示例如下:

只有分支为production时,才会进入“Example Deploy”阶段。这样就可以避免在some-label的agent中拉取代码,从而达到加速pipeline执行的目的。
Jenkins分布式构建与并行构建的更多相关文章
- Jenkins 分布式和并发构建
		
1. 分布式构建 1.1 添加 linux 节点 1.2 添加 windows 节点 2. 并发构建 2.1 原理 2.2 示例:分别用 chrome/IE/Firefox 并行测试 1. 分布式构建 ...
 - Jenkins分布式构建
		
Jenkins分布式构建 有时,如果有一个实例,它是一个更大,更重的项目,需要定期编译生成在许多计算机上.并运行所有这些构建了中央台机器上可能不是最好的选择.在这种情况下,人们可以配置其他Jenkin ...
 - 06 . Jenkins分布式构建和Pipline
		
Pipline简介 pipline 是帮助 Jenkins 实现 CI 到 CD 转变的重要角色,是运行在 jenkins 2.X 版本的核心插件,简单来 说 Pipline 就是一套运行于 Jenk ...
 - Jenkins分布式与并行
		
目录 一.简介 二.agent 通过JNLP协议增加agent 通过Swarm插件增加agent agent部分详解 三.agent放入Docker 使用Docker 配置Docker私有仓库 四.并 ...
 - 利用Jenkins自动部署工具间接构建kettle的调度平台
		
关于Jenkins的介绍我就不说了,自己百度,因为这个工具调用脚本只是他的功能的冰山一角,其他功能我也不能理解,因为不是那个领域. 下面我就介绍一下为什么我们需要一个调度平台,以及学习完 ...
 - [源码解析] PyTorch 分布式(11) ----- DistributedDataParallel 之 构建Reducer
		
[源码解析] PyTorch 分布式(11) ----- DistributedDataParallel 之 构建Reducer 目录 [源码解析] PyTorch 分布式(11) ----- Dis ...
 - jenkins(二)项目构建
		
通过上一篇“jenkins(一)集成环境搭建示例”,已经完成了jenkins的安装,基本配置,启动,下面继续小结jenkins使用 一.jenkins系统配置 访问jenkins,点击系统管理-> ...
 - jenkins学习之自动打包构建nodejs应用
		
上一节记录了下jenkins在centos下的安装,这节继续,说下怎么使用jenkins和nodejs进行自动打包更新服务. 创建任务 创建任务比较简单,这里我们创建自由风格项目: General信息 ...
 - jenkins部署.net平台自动化构建
		
在引入自动化部署工具的时候,我们对比了jenkins和gitlab CI,jenkins有非常丰富的插件,配置起来方便.gitlab CI更倾向于脚本配置,当然jenkins也可以使用pipeline ...
 
随机推荐
- 地理位置(Geolocation)API 简介
			
一.开篇简述 Geolocation API(地理位置应用程序接口)提供了一个可以准确知道浏览器用户当前位置的方法.且目前看来浏览器的支持情况还算不错(因为新版本的IE支持了该API),这使得在不久之 ...
 - 添砖加瓦:Linux系统监测
			
前言 前段时间因为项目需求,需要实时获取系统当前的运行状态,遂查阅了不少资料,基于/proc目录下的部分文件,实现了系统CPU.内存.网络和磁盘的实时监测. 一.CPU使用情况获取 获取CPU使用情况 ...
 - kettle_errot_karafLifecycleListenter
			
使用kettle 6.1 通过命令行批量执行作业的过程中,发现偶尔有作业执行时间会变慢几分钟,查看日志发现改作业开始就报了一个错 报错之后才会继续下面的作业,虽然不影响最终作业执行结果,但也延误了一些 ...
 - 安卓权威编程指南-笔记(第27章 broadcast intent)
			
本章需求:首先,让应用轮询新结果并在有所发现时及时通知用户,即使用户重启设备后还没有打开过应用.其次,保证用户在使用应用时不出现新结果通知. 1. 一般intent和broadcast intent ...
 - C:指针习题
			
1. 请指出以下程序段中的错误. 程序中的错误有:(1)p=i:类型不匹配.(2)q=*p:q 是指针,*p 是指针 p 指向变量的值.(3)t='b':t 是指针类型. 解释:指针变量是一种存放地址 ...
 - 作为前端,你需要懂得javascript实现继承的方法
			
在ES6之前,javascript不跟其他语言一样,有直接继承的方法,它需要借助于构造函数+原型对象模拟实现继承.现在我们可以利用ES6的extends方法实现继承,如果想了解更多有关ES6实现的继承 ...
 - 使用EventBus + Redis发布订阅模式提升业务执行性能
			
前言 最近一直奔波于面试,面了几家公司的研发.有让我受益颇多的面试经验,也有让我感觉浪费时间的面试经历~因为疫情原因,最近宅在家里也没事,就想着使用Redis配合事件总线去实现下具体的业务. 需求 一 ...
 - 从0开发3D引擎(十二):使用领域驱动设计,从最小3D程序中提炼引擎(第三部分)
			
目录 上一篇博文 继续实现 实现"DirectorJsAPI.init" 实现"保存WebGL上下文"限界上下文 实现"初始化所有Shader&quo ...
 - py基础之有序列表
			
L =['adam',95.5,'lisa',85,'bart','bart',59]print (L)#list是一种有序的列表,可以使用索引访问每个list中的值print (L[1])#list ...
 - VGG16等keras预训练权重文件的下载及本地存放
			
VGG16等keras预训练权重文件的下载: https://github.com/fchollet/deep-learning-models/releases/ .h5文件本地存放目录: Linux ...