一.简介
在前面的章节中,所有的Jenkins项目都是在Jenkins master的executor上执行的。如果Jenkins master上只有两个executor,那么只有两个项目能同时执行,其他项目都必须要排队。假如单机足够强大,让更多项目同时执行的方法就是增加executor。但单机的容量总会遇到上限,而且还会有单节点问题。解决办法就是将Jenkins项目分配到多台机器上执行,这就是分布式构建。 在真正介绍分布式构建前,我们需要了解一下Jenkins的架构,因为它决定了分布式构建的实现。
Jenkins采用的是“master+agent”架构(有时也称为“master+slave”架构),如图14-1所示。Jenkins master负责提供界面、处理HTTP请求及管理构建环境;构建的执行则由Jenkins agent负责(早期,agent也被称为slave。目前还有一些插件沿用slave的概念)。基于这样的架构,只需要增加agent就可以轻松支持更多的项目同时执行。这种方式称为Jenkins agent的横向扩容。
二.agent
你可以通过以下方式来增加agent:
1. 在Jenkins主页面上点击“Manage Jenkins”。
2. 点击“System Information”。
3. 找到“Number of Nodes”并输入要添加的节点数量。
4. 点击“Save”。
5. 点击“Add Node”并按照提示完成新节点的安装和配置。
6. 在新节点上安装并启动Jenkins agent。
当agent数量变多时,如何知道哪些agent支持JDK8,哪些agent支持node.js环境呢?我们可以给agent打标签来确定。通过标签将多个agent分配到同一个逻辑组中,这和过程被称为打标签。同一个agent可以拥有多个标签。在标签名中不能包含空格,也不能包含 ! & | <> ()这些特殊字符中的任何一个,因为包含特殊字符的标签名与标签表达式冲突。对于支持JDK8的agent,我们打上jdk8标签;对于支持nodejs的agent,打上对应的。如果一个agent支持多个,那就打多个标签。
在打标签时,可以根据以下几个维度来进行:工具链:jdk nodejs ruby,也可以加上工具的版本,如jdk6,jdk8;操作系统:linux,windows,osx;或者加上操作系统的版本,如ubuntu18.04,centos7.3;系统位数: 32, 63。
通过JNLP协议增加agent:java网络启动协议(JNLP)是一种允许客户端启动托管在远程web服务器上的应用程序的协议。Jenkins master与agent通过JNLP协议进行通信。而java web start(jws)可以被理解为JNLP协议的一个客户端。
要使用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,进入配置Name:agent名称Remote root directory:agent机器上的工作目录(Jenkins master不关心),使用决定路径Labels:agent的标签Usage:agent的使用策略。有2种Use this node as much as possible,尽可能使用此agent。
在Jenkins中,我们可以通过JNLP协议来增加agent。这种方式需要在Jenkins界面上进行手动操作,因为它无法自动化。以下是使用JNLP协议增加agent的步骤:
1. 配置节点:只有当构建任务符合本agent的标签时,才使用此agent。配置完成后进入节点列表页面,此时master节点的状态显示是在线的,即可用的。
2. 单机节点列表的node1,跳转到Agent node1页面。
3. JNLP协议agent连接Jenkins master还有3种方式。一是在agent机器的浏览器中打开此页面,单机Launch按钮;二是通过javaws命令从master节点下载java web start程序;三是无界面方式连接,通过命令操作。
4. 使用命令行连接:
```bash
/jenkins/jnlpJars/agent.jar java -jar agent.jar -jnlpUrl http://1.1.1.1/jenkins/computer/node1/slave-agent.jnlp -workDir "/app"
```
其中,`-secret******`就是agent与master之间的连接凭证。每一个JNLP客户端的凭证都不一样。
5. 升级Jenkins后,也需要重新下载agent.jar。agent.jar需要与Jenkins master同步升级。
需要注意的是,在安全性要求相对较高的情况下,只能手动增加agent;增加Windows agent;通过Swarm插件增加agent等场景下,我们会使用这种方式。
warm插件可以帮助我们更方便地增加agent,安装此插件后,无需在Jenkins界面上进行手动操作即可增加agent。只需启动Swarm客户端(指定Jenkins master地址),master与agent便会自动建立连接。
首先,我们需要安装Swarm插件(swarm)。安装完成后,请确保Jenkins agent机器上已安装JDK。接下来,我们可以通过以下命令启动Swarm客户端:
```bash
java -jar swarm-client-3.9.jar -username admin -password admin -master http://1.1.1.1/jenkins -name swarm-node
```
如果连接显示成功,节点页面上可以看到swarm客户端已成功连接。
以下是swarm-client部分参数的介绍:
- `deleteExistingClients`:如果Jenkins master上已经存在同名的node,则先删除(慎用)
- `description`:描述
- `disableClientsUniqueld`:默认情况下,Swarm会在node名称后加上一个唯一ID。加入此参数后,代表取消加上唯一ID。
- `disableSslVerification`:取消SSL校验
- `executors N`:设置executor的个数
- `labels VAL`:分配给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秒。
您可以通过运行`java xx.jar -help`来查看所有可用参数。