【我的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 ...
随机推荐
- 一款基于jQuery的图片左右滑动焦点图
今天给大家分享一款基于jQuery的焦点图插件,这款jQuery焦点图插件的特点是可以多张图片左右滑动切换,可以点击切换按钮进行图片滑动,同时也支持图片自动切换.另外,这款jQuery焦点图是宽屏的, ...
- VS中C#读取app.config数据库配置字符串的三种方法(转)
关于VS2008或VS2005中数据库配置字符串的三种取法 VS2008建立Form程序时,如果添加数据源会在配置文件 app.config中自动写入连接字符串,这个字符串将会在你利用DataSet, ...
- Lua中的table函数库
table.concat(table, sep, start, end) concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组 ...
- 很多人都不知道的监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
版权声明:本文为博主原创文章,未经博主允许不得转载. 在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的 需求,那 ...
- 构造 - HDU 5402 Travelling Salesman Problem
Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一 ...
- 逻辑表+session
- (转)FFMPEG-数据结构解释(AVCodecContext,AVStream,AVFormatContext)
AVCodecContext 这是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息 如果是单纯使用libavcodec,这部分信息需要调用者进行初始化:如果是使用整个FFMPEG库 ...
- Android的Parcelable中describeContents方法的作用
这个方法返回的值通常为0,那什么情况下需要填写其他值呢? 这个方法到目前为止返回其他唯一有效的值就是CONTENTS_FILE_DESCRIPTOR(0x01),指明这个Parcel的内容包含文件描述 ...
- [css]解决iframe在ios设备上无法滚动
原因: safari的webkit内核特性 解决方案: 在iframe外包裹一层div并另外设置其css属性为如下: -webkit-overflow-scrolling:touch; overflo ...
- 开启mysql日志及若干问题
今天学习了mysql日志功能,以前也有所了解,只不过没有深入的学习,所以趁着“余热”,把我从网上找到的资料与实践 结合起来,总结一下其基本用法.学习从来都不是无趣的,就看你怎么看待学习. 1.查看查询 ...