第二节 分布式构建与并行构建
1. Jenkins架构
Jenkins采用的是"master+agent"架构(有时也称为master+slave架构),Jenkins master负责提供界面、处理HTTP请求及管理构建环境构建的执行则由Jenkins agent负责(早期agent也被称为slave。目前还有一些插件沿用slave的概念)。
基于这样的架构只需要增加agent就可以轻松支待更多的项目同时执行。这种方式称为Jenkins agent的横向扩容
对于Jenkins matter存在单节点问题是显而易见的,但是目前还没有很好的解决方案

node:节点,指包含Jenkins环境及有能力执行项目的机器。master和agent都被认为是节 点。executor:执行器,是真正执行项目的单元。一个执行器可以被理解为一个单独的进程(事 实上是线程)。在一个节点上可以运行多个执行器。agent:代理,在概念上指的是相对于Jenkins master的一种角色,实际上是指运行在机器或 容器中的一个程序,它会连接上Jenkins master,并执行Jenkins master分配给它的任务。slave:与agent表达的是一个东西,只是叫法不同。 理解node、executor、agent、slave之间的关系,对于做好分布式构建很重要。
总而言之,executor:的概念是相对于node的,没有node也就谈不上executor了。node通常指的是机器(不论是物理的还是虚拟的)。
agent有时指一个程序,有时指一种角色(相对于master 而言),这取决于上下文。对一于slave,可以等同于agent
总而言之,executor:的概念是相对于node的,没有node也就谈不上executor了。node通常指 的是机器(不论是物理的还是虚拟的)。agent有时指一个程序,有时指一种角色(相对于master 而言),这取决于上下文。对一于slave,可以等同于agent
2 增加agent
实现分布式构建最常用、最基本的方式就是增加agent. Jenkins agent作为一个负责执行任务的程序,它需要与Jenkins master建立双向连接。连接方式有多种,这也代表有多种增加agent的方式。 在真正介绍如何增加agent前,我们需要了解标签((label)在分布式构建中的作用。
2-1 对agent打标签
当agent数量变多时,如何知道哪些agent支持JDK8.哪些agent支持Node.js环境呢?我们可以通过给agent打标签(有时也称为tag)来确定。
通过标签将多个agent 分配到同一个逻辑组中,这个过程被称为打标签。同一个agent可以拥有多个标签。在标签名中不能包含空格,也不能包含!、&、{、<、>、(、)这些特殊字符中的任何一个。因为包含特殊字符的标签名与标签表达式(用于过滤agent)冲突。
对于支持JDK8的agent,我们打上jdk8标签;对于支持Node.js的agent,我们打上nodejs 标签;如果一个agen同时支持JDK8和Node.js,那么就两个标签都打上。
在打标签时,可以根据以下几个维度来进行。
- 工具链:
jdk\nodejs\ruby;也可以加上工具的版本,如jdk6、jdk8. - 操作系统:linux、 windows、 osx;或者加上操作系统的版本,如ubuntul 8.04、 centos7.30
- 系统位数:32bit、64bit
可以根据实际项目情况新增维度。 对于不同的增加agent的方式,打标签的方式也不同。
2-2通过JNLP协议增加agent
Java网络启动协议(JNLP)是种允许客户端启动托管在远程Web服务器上的应用程序的协议。Jeakins master与agent通过JNLP协议进行通信。而Jana Web Start(JWS)可以被理解为 JNLP协议的一个客户端。现实中人们常常将JNLP和JWS看成是一种东西
接下来我们来看看通过JNLP协议城加agent的具体步骤
进入Manage Jenkins -> Globa Security -> TCP Port for JNLP配置页面, 我们可以选择开放固定端口或者随机开放Jenkins Master的一个端口来提供JNLP服务

随机开放端口不利于自动化所以透择开放周定端口。此端口用于master与agent之间的
TCP通信与访问Jenkins界面时的端口有别 。

Name:agent名称。Remote root directory:agent机器上的工作目录(Jenkins master不关心),使用绝对路径。/home/vagrant/workspace/
$ tree -L 1 workspace/
workspace/
├── Chapter2-5Script
├── Chapter2-5Script@tmp
├── Chapter2_test2
├── Chapter2_test2@tmp
├── HelloWorld
└── HelloWorld@tmp
6 directories, 0 files
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 Web Start"