前两篇文章VirtualBox+Vagrant搭建虚拟机、基于Jenkins快速搭建CI,分别完成了:创建虚拟机和搭建CI,接下来在完成以上工作的基础上,进一步完成分布式CI的搭建。分布式任务构建即就是一个master为中心,很多slave来进行具体的构建操作。在自动化测试过程中经常用到分布式构建,多台执行机来进行任务的构建以及自动化脚本的运行操作。
Jenkins其实自带分布式特性,是Master/Slave的模型。在Master上分配任务,然后在Slave或者Master上完成。这个特性带来两个好处:(1)能够有效分担主节点上的压力,加快构建速度;(2)能够指定特定的任务在特定的主机上进行。
使用场景
- 如果项目需要定期集成,同时每次集成都需要较长时间。如果都运行在master服务器上,会消耗过多资源,这时就需要在建立多台设备,并配置作为slave机器来为master提供负载服务。
- 需要不同的环境集成。如一个项目,包含web端,包含Android端,也包含iOS端,不同的测试需要的环境都不同,此时可以为每个环境配置一个slave进行测试。
一个slave是一台为主的Jenkins机器建立一个负载build项目的电脑,一旦建立这个分布式任务是完全自动化的。每个slave运行一个单独的程序,不需要再一个slave安装全部的Jenkins。
新建节点
Jenkins -> 系统管理 -> 管理节点 -> 新建节点 -> 输入节点名称
- Dumb Slave:新建一个节点
- 复制现有节点:从已存在的节点中复制一份配置(如果存在节点才会显示)
节点配置
-
描述
节点描述,支持中文 -
# of executors
最大同时构建数量(根据机器的性能定,单颗四核cpu建议不要超过5)【必须为数字】 -
远程工作目录
选择slave上的工作目录,即Job中checkout出的代码所在的workspace目录里 -
标签
该节点的唯一标识,当在Job中要指定只在该节点进行构建与测试时,通过该唯一标识进行指定 -
启动方法
有四种启动方法,下面会具体讲解 -
Availability
- Keep this slave on-line as much as possible:尽可能保持节点在线
- Take this slave on-line according to a schedule:根据时间表在线(类似于Linux的定时任务)
- Take this slave on-line when in demand and off-line when idle:让Jenkins根据需求自动连接或者离线
选择启动方式
四种启动方式如下:
- Launch agent via Java Web Start 通过Java Web Start连接节点 (适用于所有支持Java程序的系统)
- Launch slave via execution of command on the Master 通过主节点的控制台连接节点
- Launch slave agents via SSH 在Unix(包括Linux)机器上通过SSH通道连接节点 (适用于Unix和Linux)
- Let Jenkins control this Windows slave as a Windows service 让Jenkins节点添加到Windows服务中
关于四种启动方式如何选择,建议直接单击Jenkins启动方式一栏旁边的问号图标,会有每种启动方式的具体解释。具体,这里slave server 为macOS,可以使用Java Web Start ,也可以使用ssh,但由于项目限制,slave机器IP不固定,故选择了Java Web Start。
Tips:默认第一次打开时,没有 Launch agent via Java Web Start
方式,需要在系统配置中进行配置,Jenkins -> 系统管理 -> Configure Global Security -> Agent -> 指定端口,此时返回配置节点,则可以看到该项。
连接节点
到目前为止,节点配置工作完成,并已创建成功,新的节点机初始化将处于脱机状态,接下来需要连接节点。介绍Launch slave agents via Java Web Start连接方式,Launch slave agents on Unix machines via SSH点击保存后会自动连接。
创建完成后,如图所示:
根据系统提示,需要完成下载工作,下载到slave节点的远程工作目录:
- 点击“Launch”,下载slave-agent.jnlp文件
- 点击“slave.jar”,下载slave.jar文件
下载完成后,就要启动slave了,有两种启动方式,但本质都是将master中的slave-agetn.jnlp文件下载至slave所在的虚拟机,然后运行文件。两种方式如下:
-
javaws slave-agent.jnlp
此时会启动一个图形化界面,如下图所示。 -
java -jar [slave.jar](http://localhost:8080/jnlpJars/slave.jar) -jnlpUrl http://localhost:8080/computer/test_node/slave-agent.jnlp -secret 3010309baac6dc6b92848f32d1f5744bae179275b1f9f5f6e9deb17048ea282e -workDir "/Users/yxwang/VOS/jenkims-android-node"
此时不会出现图形化界面
关联Job
关联Job有多种方式,这里在Jenkinsfile中,采用如下方式
node('test_node'){
stage('Checkout'){
checkout scm
}
}
node('master'){
stage('Test'){
echo 'Test'
}
}
此时直接在Jenkins中构建项目,即可根据node后跟的label名称在不同的node上进行构建。结果可以具体构建结果后的 Console Output
中查看,Running on
后跟不同节点的路径。