由于公司的Jenkins任务越来越多,而且所有的Android Jenkins任务都在同一台服务器上进行编译,而且该服务器配置Jenkins任务最多3个任务同时运行,所以有时候大家一起编译的时候,只能一个一个的等待。

因此最近我重新搭建了一台Center OS服务器,配置好了SDK,JDK等一系列android的编译环境。并且在新的Center OS服务器上搭建好了新的Jenkins平台,本来想把部分的Android Jenkins任务迁移到新的Center OS服务器上的Jenkins平台来,但是这样的话,又得重新创建用户名密码等一些繁琐的操作,因此决定在老的Jenkins平台上通过新增节点的方式,将在新的Center OS服务器使用起来,这样的话就可以同时又两台服务器同时处理Jenkins任务,大大减少了大家的排队时间。

现在我将如何新增节点的方式记录下来,以备后用。

如下图是一张网上的关于Master/Slave架构示意图。

Jenkins pipeline 部署多个slave jenkins部署多台服务器_master节点重置后添加node报错

Master/Slave相当于Server和agent的概念。Master提供web接口让用户来管理job和slave,job可以运行在master本机或者被分配到slave上运行。一个master可以关联多个slave用来为不同的job或相同的job的不同配置来服务。


1


相关概念

以下是从  转载的相关概念

当job被分配到slave上运行的时候,此时master和slave其实是建立的双向字节流的连接,其中连接方法主要有如下几种:

1. master通过ssh来启动slave

Jenkins内置有ssh客户端实现,可以用来与远程的sshd通信,从而启动slave agent。这是对*unix系统的slave最方便的方法,因为*unix系统一般默认安装有sshd。在创建ssh连接的slave的时候,你需要提供slave的host名字,用户名和ssh证书。创建public/private keys,然后将public key拷贝到slave的~/.ssh/authorized_keys中,将private key 保存到master上某ppk文件中。jenkins将会自动地完成其他的配置工作,例如copy slave agent的binary,启动和停止slave。但是你的job运行所依赖其他的项目需要你自己设置。

2. master通过WMI+DCOM来启动windows slave

对于Windows的Slave,Jenkins可以使用Windows2000及以后内置的远程管理功能(WMI+DCOM),你只需要提供对slave有管理员访问权限的用户名和密码,jenkins将远程地创建windows service然后远程地启动和停止他们。

对于windows的系统,这是最方便的方法,但是此方法不允许运行有显示交互的GUI程序。

注意:不想其他类型的链接方式,此种方式slave(note)的名字非常重要,将被用来当做slave的地址访问slave。

3. 实现自己的脚本来启动slave

如果上面成套的方法不够灵活,你可以实现自己的脚本来启动slave。你需要将启动脚本放到master,然后告诉jenkins master在需要的时候调用此脚本来启动slave。

典型地,你的脚本使用远程程序执行机制,例如SSH,RSH,或类似的方法(在windows,可以通过cygwin或psexec来完成),

在脚本的最后需要执行类似Java -jar slave.jar来启动slave。slave.jar可以从http://yourjenkinsserver:port/jnlpjars/slave.jar下载,也可以在脚本的开始先下载此slave.jar从而保证slave.jar正确的版本。 但是如果使用ssh slave plugin的话,此plugin将自动地更新slave.jar。

4.通过Java web start来启动slave

jave web start(jnlp)是另一种启动slave的方法。用这种方法你需要登录到slave,打开浏览器,打开slave的配置页面来连接。还可以安装为windows service来使得slave在后台运行。

如果你需要运行的程序需要UI的交互,使用下面的方法:在slave系统上创建jenkins用户,设置自动登录,在系统的startup items增加slave JNLP文件的快捷方式,使得slave在系统登录的时候自动启动。

5. 直接启动slave

此方式类似于Java web start,可以方便地在*unix系统上将slave运行为daemon。需要配置slave为JNLP类型连接,然后在slave机器上执行

java -jar slave.jar -jnlpUrl http://yourserver:port/computer/slave-name/slave-agent.jnlp

6. Slave配置的好的建议

  • 每个slave都有用户jenkins,所有的机器使用相同的UID和GID,使得slave的管理更加简单;
  • 每个机器上jenkins用户的home目录都相同/home/jenkins, 拥有相同的目录结构使得维护简单;
  • 所有的slave运行sshd,windows运行cygwin sshd;
  • 所有的slave安装ntp client,用来与相同的ntp server同步;
  • 使用脚本sh来自动地配置slave的环境,例如创建jenkins用户,安装sshd,安装java,ant,maven等;
  • 使用脚本来启动slave,保证slave总是运行在相同的参数下:


#!/bin/bash JAVA_HOME=/opt/SUN/jdk1.6.0_04 PATH=$PATH:$JAVA_HOME/bin export PATH java -jar /var/jenkins/bin/slave.jar 2


新增节点

第一步,点击【系统管理】按钮,进入管理Jenkins页面,然后点击【管理节点】按钮,如下所示: 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_jar_02

进来之后,就可以看到已经加载好的所有节点,如下所示: 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_Jenkins_03

点击上图左侧的【新建节点】,如下所示: 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_jenkins转移到另一个服务器_04

输入【节点名称】,然后选择下面的两个单选按钮,我选择【复制现有节点】,如下所示: 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_master节点重置后添加node报错_05

 然后进入了该节点的具体配置页面,如下所示: 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_jenkins转移到另一个服务器_06

其中

  • Name是节点名字;
  • 描述(Description)是节点描述;
  • # of executors是该节点可以同时运行job的数量;
  • 远程工作目录(Remote root directory)主要是添加了workspace的目录;
  • 标签(Label)是该节点的标签名,在运行job的时候,可以使用该标签指定job运行的node;
  • 用法(Usage)是你如何使用该节点,通常选择Utilize this node as much as possible,即尽量使用该节点。
  • 启动方法(Lance method):是将该node挂载到master上的方法。这里有四个选项,常用的是前两选项,即“Launch slave agents on Unix machine via SSH”和“Launch slave agents via Java Web Start”。本文将详细介绍这两种挂载node的方法。
  • Availability是你何时连接该节点。通常选择一直连接即可,即“Keep this slave on-line as much as possible”。

这里配置【启动方法】的话,我们选择使用Launch slave agents on Unix machine via SSH,关于SSH连接slave,jenkins有如下描述:

Launch slave agents on Unix machines via SSH 
Starts a slave by sending commands over a secure SSH connection. The slave needs to be reachable from the master, and you will have to supply an account that can log in on the target machine. No root privileges are required.

这段描述的意思是说,选择此种方式连接时,master和slave必须是能够通过ssh进行连接的,必须有slave机器的账号才行,但不要求必须是root账号。 

这种方式的前提是需要安装SSH Slaves plugin插件。

这种方式的步骤如下:

  1. 输入slave节点的IP。
  2. Add Credentials。

有如下两种方式: 

1)通过Username with password方式 

需要知道slave机器的用户名和密码,见下图: 

点击【Add】按钮,弹出如下所示的框, 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_Jenkins_07

然后点击【Jenkins】按钮,弹出如下界面: 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_android_08

我们在上面填写相关的username和password,最好填上Description,如下所示:

Jenkins pipeline 部署多个slave jenkins部署多台服务器_Jenkins_09

填写完毕之后,点击【Add】即可保存。然后再在下面的界面,选择我们刚刚保存好的Credentials,如下所示: 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_jar_10

选择完毕之后,如下所示: 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_jar_11

因为该节点是备用节点,为了分流主节点的压力,所以在【用法】上,如上图所示我们选择【尽可能的使用这个节点】。

最后点击【Save】按钮保存,保存之后,进入如下的界面:

Jenkins pipeline 部署多个slave jenkins部署多台服务器_Jenkins_12

点击【Relaunch agent】按钮,启动该节点。启动过程中,会打印一堆的启动日志,如下图所示: 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_master节点重置后添加node报错_13

当看到如下所示的界面时,表示该节点已经正常启动了。 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_Jenkins_14

这个时候,我们回到主面板,可以看到刚才加的新节点如下所示: 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_android_15

其中Linux_for_android 是之前配置好的节点,Linux_for_android_new 是刚刚配置好的新节点。


3


配置Jenkins任务,使用新配置好的节点

随便挑选一个Jenkins任务,然后进入如下所示的界面: 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_jenkins转移到另一个服务器_16

如上图所示,该任务勾选了【Restrict where this project can be run】选项框,并且里面的【Label Express】值是【Linux_for_android】,这样的话表示该任务只能在【Linux_for_android】这个节点运行,刚刚新配置好的【Linux_for_android_new 】节点是不能运行该任务的。

因此我们将该勾选框去掉,如下图所示: 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_master节点重置后添加node报错_17

然后点击【保存】按钮,进行保存。接着我们试着运行下该Jenkins任务。 

Jenkins pipeline 部署多个slave jenkins部署多台服务器_jenkins转移到另一个服务器_18

 

如上图所示,当【Linux_for_android】已经有三个任务在运行的情况下,运行【AP_HttpDns】Jenkins任务,该任务自动被分配到了【Linux_for_android_new 】节点运行。

由于每个节点设置了最多可以运行3个Android Jenkins任务,因此现在可以同时有6个Android Jenkins任务在两个节点上同时运行。比之前只有一台服务器编译快多了。