【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

时间:2021-11-05 08:35:46

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

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

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

一、相关概念

以下是从 http://www.cnblogs.com/itech/archive/2011/11/11/2245849.html 转载的相关概念

当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

二、新增节点

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

其中

  • 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”。

1、启动方式【Launch slave agents on Unix machine via SSH 】

这里配置【启动方法】的话,我们选择使用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.1、通过【Username with password】的方式

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

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

1.2、通过【SSH Username with private key】的方式

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

如上图,除了可以使用【Username with password】的方式之外,还可以使用【SSH Username with private key】的方式

需要先在master机器上生成ssh key pair。生成的 public key放到slave机器的 ~/.ssh/authorized_keys里面。然后chmod 600 ~/.ssh/authorized_keys。

然后,添加连接slave的credential,见下图:

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

Scope有两个选项,分别是System(Jenkins and nodes only)“Global(Jenkins、nodes、items、child items)”

这两种方式的Scope选项,我选择的是System(Jenkins and nodes only),表示这个Credentials仅仅是用来master和node进行连接用的。

还有另外一种是“Global(Jenkins、nodes、items、child items)”,这种scope的Credential可以用来连接git等其他机器。具体选择哪种scope,根据自己的需要。就连接slave这个需求来说,哪种scope的credential都可以。

  • Username填写在master上生成key pair时使用的用户名。
  • Private key选择From the jenkins master ~/.ssh
  • Passphrase 为生成Private Key时候的密码
  • Description为改Credential的描述

余下的步骤和【通过Username with password方式】类似。

2、启动方式Launch agent via Java Web Start

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

现在我们来讲解一下启动方式【Launch agent via Java Web Start】,关于这种方式jenkins有如下描述:

Launch slave agents via Java Web Start

Starts a slave by launching an agent program through JNLP. The launch in this case is initiated by the slave, thus slaves need not be IP reachable from the master (e.g. behind the firewall.) It is still possible to start a launch without GUI, for example as a Windows service.

这段话的意思是说,JNLP方式连接salve,不需要master必须能够ssh连接到slave,只需要两者能够ping通即可。这种连接方式的slave还可以作为服务运行在slave的机器上。

这种方式连接slave的步骤如下: 在【启动方式】上选择【Launch slave agents agents via Java Web Start】

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

按照上面图片的设置方式设置完成后,点击save,就建好了一个slave节点。如下图所示。

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

接下来的任务是将该节点连到master上。与ssh方式是master主动连接slave不同,这种JNLP方式是slave主动连接master。

登陆到slave机器上,运行上图中的java -jar 命令,即可将slave连接到master上了。

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

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

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

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

四、参考链接


【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!

转载请保留原文地址:http://blog.csdn.net/ouyang_peng/article/details/75174943

如果本文对您有所帮助,欢迎您扫码下图所示的支付宝和微信支付二维码对本文进行打赏。

【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率