【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率
由于公司的Jenkins任务越来越多,而且所有的Android Jenkins任务都在同一台服务器上进行编译,而且该服务器配置Jenkins任务最多3个任务同时运行,所以有时候大家一起编译的时候,只能一个一个的等待。
因此最近我重新搭建了一台Center OS服务器,配置好了SDK,JDK等一系列Android的编译环境。并且在新的Center OS服务器上搭建好了新的Jenkins平台,本来想把部分的Android Jenkins任务迁移到新的Center OS服务器上的Jenkins平台来,但是这样的话,又得重新创建用户名密码等一些繁琐的操作,因此决定在老的Jenkins平台上通过新增节点的方式,将在新的Center OS服务器使用起来,这样的话就可以同时又两台服务器同时处理Jenkins任务,大大减少了大家的排队时间。现在我将如何新增节点的方式记录下来,以备后用。
如下图是一张网上的关于Master/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页面,然后点击【管理节点】按钮,如下所示:
进来之后,就可以看到已经加载好的所有节点,如下所示:
点击上图左侧的【新建节点】,如下所示:
输入【节点名称】,然后选择下面的两个单选按钮,我选择【复制现有节点】,如下所示:
然后进入了该节点的具体配置页面,如下所示:
其中
- 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插件。
这种方式的步骤如下:
- 输入slave节点的IP。
- Add Credentials。
有如下两种方式:
1.1、通过【Username with password】的方式
需要知道slave机器的用户名和密码,见下图:
点击【Add】按钮,弹出如下所示的框,
然后点击【Jenkins】按钮,弹出如下界面:
我们在上面填写相关的username和password,最好填上Description,如下所示:
填写完毕之后,点击【Add】即可保存。然后再在下面的界面,选择我们刚刚保存好的Credentials,如下所示:
选择完毕之后,如下所示:
因为该节点是备用节点,为了分流主节点的压力,所以在【用法】上,如上图所示我们选择【尽可能的使用这个节点】
最后点击【Save】按钮保存,保存之后,进入如下的界面:
点击【Relaunch agent】按钮,启动该节点。启动过程中,会打印一堆的启动日志,如下图所示:
当看到如下所示的界面时,表示该节点已经正常启动了。
这个时候,我们回到主面板,可以看到刚才加的新节点如下所示:
其中Linux_for_android 是之前配置好的节点,Linux_for_android_new 是刚刚配置好的新节点。
1.2、通过【SSH Username with private key】的方式
如上图,除了可以使用【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,见下图:
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
现在我们来讲解一下启动方式【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】
按照上面图片的设置方式设置完成后,点击save,就建好了一个slave节点。如下图所示。
接下来的任务是将该节点连到master上。与ssh方式是master主动连接slave不同,这种JNLP方式是slave主动连接master。
登陆到slave机器上,运行上图中的java -jar 命令,即可将slave连接到master上了。
三、配置Jenkins任务,使用新配置好的节点
随便挑选一个Jenkins任务,然后进入如下所示的界面:
如上图所示,该任务勾选了【Restrict where this project can be run】选项框,并且里面的【Label Express】值是【Linux_for_android】,这样的话表示该任务只能在【Linux_for_android】这个节点运行,刚刚新配置好的【Linux_for_android_new 】节点是不能运行该任务的。
因此我们将该勾选框去掉,如下图所示:
然后点击【保存】按钮,进行保存。接着我们试着运行下该Jenkins任务。
如上图所示,当【Linux_for_android】已经有三个任务在运行的情况下,运行【AP_HttpDns】Jenkins任务,该任务自动被分配到了【Linux_for_android_new 】节点运行。
由于每个节点设置了最多可以运行3个Android Jenkins任务,因此现在可以同时有6个Android Jenkins任务在两个节点上同时运行。比之前只有一台服务器编译快多了。
四、参考链接
- 两种常见挂载Jenkins slave节点的方法 (http://blog.csdn.net/liuchunming033/article/details/52025541)
- Hudson、Jenkins的node节点设置(分布式处理自动化测试用例)(http://www.cnblogs.com/zhuque/archive/2013/01/23/2873610.html)
- Jenkins进阶系列之——12详解Jenkins节点配置 (http://blog.csdn.net/limm33/article/details/51191263)
- Jenkins Master/Slave架构(http://www.cnblogs.com/itech/archive/2011/11/11/2245849.html)
- Different ways of starting slave agents
作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:http://blog.csdn.net/ouyang_peng/article/details/75174943
如果本文对您有所帮助,欢迎您扫码下图所示的支付宝和微信支付二维码对本文进行打赏。
【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率的更多相关文章
- [置顶] 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam
由于上一篇文章:我的Android进阶之旅------>Android之动画之Frame Animation实例 中展示的是Frame动画效果,但是之前我是将图片截取下来,不好说明确切的动画过程 ...
- 我的Android进阶之旅------> Android在TextView中显示图片方法
面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包括图像的文本信息).并简要说明实现方法. 答案:Android SDK支持例如以下显示富文本信息的方式. 1.使用T ...
- 【我的Android进阶之旅】推荐一款视频转换GIF图片格式的转换工具(Video to GIF)
一.背景 最近想把一些Android Demo的运行效果图获取下来,但是一直使用真机进行调试,在电脑上不好截取一段gif动画.而之前使用模拟器的时候可以使用 GifCam 工具进行屏幕动画截取.Gif ...
- 我的Android进阶之旅------>Android字符串资源中的单引號问题error: Apostrophe not preceded by 的解决的方法
刚刚在string字符串资源文件里,写了一个单引號.报错了,错误代码例如以下 error: Apostrophe not preceded by \ (in OuyangPeng's blog ) 资 ...
- 我的Android进阶之旅------>Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法
我的Android进阶之旅-->Android颜色值(RGB)所支持的四种常见形式 透明度百分比和十六进制对应关系表格 透明度 十六进制 100% FF 99% FC 98% FA 97% F7 ...
- 我的Android进阶之旅------>解决Jackson等第三方转换Json的开发包在开启混淆后转换的实体类数据都是null的bug
1.错误描述 今天测试人员提了一个bug,说使用我们的app出现了闪退的bug,后来通过debug断点调试,发现我们的app转换服务器发送过来的json数据后,都是为null.而之前已经提测快一个月的 ...
- 我的Android进阶之旅------>关于android:layout_weight属性的详细解析
关于androidlayout_weight属性的详细解析 效果一 效果二 图3的布局代码 图4的布局代码 效果三 图7代码 图8代码 效果四 效果五 版权声明:本文为[欧阳鹏]原创文章,欢迎转载,转 ...
- 我的Android进阶之旅------>如何解决Android 5.0中出现的警告: Service Intent must be explicit:
我的Android进阶之旅-->如何解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...
- 我的Android进阶之旅------>Java字符串格式化方法String.format()格式化float型时小数点变成逗号问题
今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.好吧,又是我来维护. 好吧,先把系统语言切换到波兰语,切换到波兰语的方法查看文章 我的And ...
随机推荐
- [kernel]内核日志及printk结构分析
一直都知道内核printk分级机制,但是没有去了解过,前段时间和一个同事聊到开机启动打印太多,只需要设置一下等级即可:另外今天看驱动源码,也看到类似于Printk(KERN_ERR "... ...
- [mmc/sdio]Linux下的sdio和mmc
http://www.cnblogs.com/RandyQ/p/3607107.html
- 深度剖析ConcurrentHashMap(转)
概述 还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多面试书中都说到: HashMap是非线程安全的,HashTable是线程安全的. 那个时候没怎么写Java代码,所以根 ...
- SQL合并数据
--CREATE TABLE TMaterial (PMaterial INT,FName NVARCHAR(32))--INSERT INTO TMaterial--SELECT 1,'A' UNI ...
- Lua中的字符串函数库
字符串库中的一些函数是非常简单的: string.len(s) 返回字符串s的长度:string.rep(s, n) 返回重复n次字符串s的串:你使用string.rep( ...
- Bitcoin: A Peer-to-Peer Electronic Cash System(比特币论文翻译)
比特币历史: 2008年,比特币论文诞生 2009年1月,第一批比特币诞生 2011年4月,比特币价格第一次达到了1美元 2011年6月,涨到30美元,然后开始跌 2013年1月,4美元 2013年1 ...
- 3% of users browse with IE9 and 14% of users have a disability. Why do we only cater for the former?
我想要用一个否定声明来開始我的文章:对于怎样创造一个易于用户体验的站点,我也不是了解非常多. 让作为一个资深开发人员的我操心的是,我在并没有获得太多关于这个主题(指怎样创造一个易于用户体验的站点)的实 ...
- Leetcode_num4_Reverse Integer
题目: Reverse digits of an integer. Have you thought about this? Here are some good questions to ask b ...
- PHPExcel导出插入图片和居中问题
首先到网上先下载PHPExcel 下载后解压得到这两个文件 下载后引用该文件 最后编写相关代码: 首先是图片插入导出 $objDrawing = new PHPExcel_Worksheet_Draw ...
- 浅谈AutoResetEvent的用法
using System;using System.Threading; namespace AutoResetEvent_Examples{ class MyMainClass { ...