场景描述:
之前通过jenkins搭建过ios自动化打包,使用1台mac mini作为打包机.现在每次打包时间是55分钟左右,而且同时最多只能打包2个job,发版周,测试同事们经常会浪费很多时间在排队打包上.
为了解决这个问题,决定做分布式打包,这样同时有3台机器都可以打包,可以缩短排队时间.
经过一番调研,一开始是打算在不同的机器上都安装jenkins,然后通过1个接口(自己写)去检测哪个机器上的jenkins是闲置可打包的,在搜索的过程中,发现jenkins可以做集群管理.再细细一看,完全能满足我的需求.且比自己写接口能更快实现功能.在这里记录下我的配置过程,以及配置过程中遇到的问题及解决办法.
我的需求:
完成ios分布式打包
环境说明:
共4台机器,我使用centOS7 上安装的jenkins作为 master
- master centOS7
- slave1 mac
- slave2 mac
- slave3 mac
- slave4 windows(本文中暂时没有涉及windows_slave的配置)
其它说明:
- centOS7机器 安装jenkins
- slave机器 不需要安装jenkins,在指定目录下新建一个文件夹:
- 在slave机器新建一个文件夹:agent_jenkins(自定义文件名,目录),它将作为 job在slave机器的工作目录
搭建完成效果:
1.通过master_jenkins 连接salve机器成功
2.通过master_jenkins 创建job,即可控制该 job使用slave环境运行构建
3.在master_jenkins构建队列处,可以看到slave机器构建状态
具体配置:
step1:创建节点
jenkins>>系统管理>>节点管理>>新建节点>>填写节点名称,勾选 [固定节点]单选钮>>OK
注意:如果从来没有配置过节点,不会出现 Copy Existing Node选项
点“OK”后,进入node配置
step2:配置节点:
前置条件:
在slave新建文件夹:agent_jenkins
我创建文件夹目录位置是:/Users/xxx/agent_jenkins (你可以自己定义agent_jenkins在哪个目录新建,可以与我的不一样)
如果没有找到“通过java web启动代理”,需要到 系统管理-全局安装配置 打钩“Enable Agent”。
注意:在启动方法这一项,这里选择通过java Web的方式启动,我试了其它2项,jenkins都抛了异常
可能是我的配置有问题吧,但是为了不浪费时间,当我试到[通过Java Web启动代理]这个选项,不抛异常时,就果断把之前的异常抛到脑后了
配置参数说明:
结点名称:随意填,不过最好能见名知义,我这里用的格式是:slave机型_ip
描述:随意填
并发构建数:同时进行构建的最大数量,我这里设置为2
工作目录:从节点上的jenkins工作目录,即一开始我们创建的agent_jenkins所在的目录
标签:随意填,我们将项目关联到节点时,可以根据标签来(也可以根据结点名称)。即master_jenkins通过这个标签来判断job在哪个slave机器上构建
该项配置在 job >> configure>>General选项下
用法:因为我是用这台机器作IOS打包机,所以选择“只允许运行绑定到这台机器的job”,这外选项相当于设置结点优先级。
启动方式:通过java Web的方式启动,由master连接到slave来执行任务
可用性:尽量保持在线
工具位置:不设置
环境变量:不设置
注意配置slave机器的环境变量,否则在执行job时就有可能会遇到找不到环境变量的问题
比如,我遇到了在执行ios打包时,找不到pod命令的问题
配置方法:
远程连接你的slave机器,在终端中输入echo $PATH
,终端会打印出一串字符串,几个路径,复制该路径,返回到Jenkins中,
勾选环境变量选项,填写格式如下:
变量名:PATH
值:echo $PATH的结果
step3:解决配置完成后,slave连接不成功的问题
点击SAVE,这时候看到的界面如图: 并没有正确连接到slave52的机器
点进去看一下报错信息:
从提示信息可以看出,jenkins提供了2种解决方案:
注意:这2个方法都要在salve机器上操作
方法1.通过浏览器下载 slave-agent.jnlp文件,并安装
方法2.下载 agent.jar文件,并在命令行执行命令
我操作过程中,这2个方法的区别是:
方法1我需要登录slave机器,在浏览器中下载slave_agent.jnlp,通过可视化的方式,进行安装;
方法2则是直接在本地下载jar文件,然后通过scp命令将jar文件复制到slave机器,最后通过java命令运行jar文件.在操作过程中,并不需要直接去登录slave机器(我本地环境是ubuntu,slave是mac,本地可以通过ssh远程连接mac)
方法1操作过程:
首先在slave_mac机器打开master_jenkins网址,jenkins>>节点管理>>打开slave_51节点>>点击Launch,浏览器将会下载一个文件,文件名是:slave-agent.jnlp
我在slave_mac上安装这个文件,此时可能会遇到一个错误:mac只允许安装来自appstore的应用.
解决办法是,打开 系统偏好设置>>安全性与隐私>>通用>>在 允许从以下位置下载的应用选项栏中,选择 App Store和被认可的开发者选项
然后双击 slave-agent.jnlp文件,就可以安装了,这时候会出现下面这个窗口
注意,不能将这个窗口关闭,否则master就会失去对该 slave的连接
方法2操作过程:
我是在本地下载agent.jar文件的,然后将该文件复制至slave机器,命令如下:
wangju@wangju-HP-348-G4:~/Downloads$ scp /home/wangju/Downloads/agent.jar <username>@10.1.71.51:/Users/xxxx/agent_jar/
agent.jar 100% 771KB 10.8MB/s 00:00
ssh 连接slave机器,查看agent.jar文件已经复制到agent_jar文件夹下了
Mac mini:~ xxx$ cd agent_jar
Mac mini:agent_jar xxx$ ls
agent.jar
在slave机器命令行,执行命令
java -jar agent.jar -jnlpUrl http://10.2.1.92:8080/jenkins/computer/mac_10.1.71.51/slave-agent.jnlp -secret 42c65d0c9de7b44ef8516ea01fd1e75c402fd5fc1a525db02e0da1437d8cde46 -workDir "/Users/5i5j/agent_jenkins"
执行效果:
注意:在需要master连接slave机器的时间段,不能关闭命令行窗口,一旦关闭命令行窗口,master就会失去slave机器的连接
此时再master机器查看刚才新建的slave51机器,已经连接成功了(小电脑图标旁边没有 X 号了)
验证配置效果:
通过master-jenkins创建1个job,该job可以在slave机器上进行构建
操作步骤:
1.在master-jenkins,新建1个job
2.General>>Restrict where this project can be run(选择job要运行的节点机器)
Label Expression 选择我们刚刚新建的slave51机器 标签:mac_mini_slave
3.构建job,可以看到job已经启动了
至此,就完成了jenkins集群的配置
参考文档:
和我的需求场景一致:
搭建jenkins集群
配置步骤比较详细
Jenkins 集群搭建
jenkins节点管理参考以下2篇文档: