一、分布式
Jenkins的架构是为分布式编译而设计的。这样允许我们为每一个编译项目使用不同的编译环境,平衡编译压力。Jenkins控制节点负责管理agents、编排job以及监agents。
通常开始我们只启动一个master 节点,但是随着编译job越来越多,master的资源(cpu、内存等)会被耗尽,这时可以升级master的硬件配置,或者可以创建几个agents来缓解master的压力,有时你可能需要不同的环境来编译,所以创建不同的agent来表示不同的环境是最好的选择。
1.1 Master to agent connections
最流行的配置方式是通过master来初始化连接。这种方式agent配置量最少,都是通过master来控制。需要master能够访问agent(一般通过ssh)。出于安全考虑这种方式有时无法实现,这时可以用agent通过'JNLP'连接master。
1.2 Agent to master connections
有时master无法访问agent,所以不能通过master来初始化这个过程。这时,可以通过叫'JNLP’的agent配置来做这件事。这意味着master不需要访问agent,但是agent要能访问到master。这对于有防火墙的agent来说非常方便。
1.3 选择运行的agent
下面会讲到,agent可以被打标签。这意味着不同的编译、pipeline可以分配到指定的agent上(通过标签)。这些agent也被成为"Node"。
二、启动agents的方式
选择哪种启动方式,取决于个人的网络环境、操作系统,以及希望从master发起连接还是从agent。
2.1 master通过SSH启动agent
Jenkins有一个内置的SSH客户端,可以用来和远端的SSH服务端通信。这时Unix agents是最方便也是最常用的方式,通常Unix上自带有sshd服务。登陆Jenkins,点击Manage Jenkins
->Manage Nodes
->New Node
。在这个过程中,需要提供连接信息(比如agent的主机名、用户名和SSH认证)。注意agent需要master的ssh公钥拷贝到~/.ssh/authorized_keys
。(参考This is a decent howto 。Jenkins会自动做后面的事情,包括拷贝agent需要的二进制文件、启动和停止agents。如果你的项目需要其他外部的依赖(比如~/.m2/settings.xml
,或者特殊版本JAVA),需要手动设置。 可以参考Slave Setup Plugin
这是在Unix上设置最简单的方式。然后,如果在Windows上,cygwin没有ssh命令,但是可以使用PuTTY 和 PuTTYgen来生成公私钥。
为了通过cygwin sshd连接Windows agent,参考 SSH agents and Cygwin
2.2 在Windows上启动agent
Jenkins可以使用集成在Windows 2000或之后版本((WMI+DCOM)的远程管理工具来安装agents。在这个过程中,需要提供具有管理员权限的用户名和密码,然后Jenkins会在Windows上创建一个Windows服务、并启动它们。
2.3 自己编写启动脚本
如果以上方法都不适合你,可以自己写脚本启动agent。在master节点上放置一个启动脚本,每当需要连接到agent时启动这个脚本。
同样地,你的脚本可以使用SSH或者其他类似地远程工具。比如在windows上使用 cygwin 或者psexec,Jenkins不没有固定地连接方式。
Jenkins唯一要求地就是脚本最后可以通过类似于java -jar agent.jar
的方式启动agent,并且让它的stdin/stdout连接到你的脚本的stdin/stdout。例如,这样的脚本"ssh
*mynode*
java -jar ~/bin/agent.jar
" 就可以。
agent.jar
可以从[http://yourserver:port/jnlpJars/agent.jar](http://yourserverport/)
下载。从这里下载可以保证master和agent的版本一致。这种方式也消除了agent.jar
的升级问题。SSH Slaves会自动这样做,所以这种方式启动的agent总是使用的正确的agent.jar
。
2.4 通过"JNLP"的方式连接master启动
另一个种启动agent的方式是通过Java Web Start (JNLP)。
这种方式需要服务端做额外的配置: Jenkins->Global Security->TCP port for JNLP agents.
这种方式,你需要登陆到agent,使用浏览器打开agent页面。页面上会有一个JNLP的发射按钮。按下这个按钮,Java Web Start会启动,它会在浏览器运行的机器上启动一个agent。
这种方式对于master不能访问agent很方便。这样如果agent掉线,没法从master上启动它。
在Windows上可以将这个agent作为一个Windows service 这样就不用每次手工启动了。
备注:如果master运行在一个反向代理后面,在JNLP的启动页面"Advanced"选项种需要配置"Tunnel connection through"。
2.5 命令行的方式启动agent
这种方式和JNLP类似,只是它通过命令行而不是页面的方式启动agent:
$ java -jar agent.jar -jnlpUrl http://yourserver:port/computer/agent-name/slave-agent.jnlp
"agent-name"根据实际的情况替换成自己的。
这些agents就像一个集群,我们知道维护集群并不容易。比如你必须保证这些agent有 JDKs, Ant, CVS, 或者其他编译需要的工具。也要保证agents运行正常。
三、Linux配置用例
这一节描述了Jenkins agents安装的一个例子。master节点运行在SPARC Solaris,大部分的agents也运行在这个上面,还有一些在Opteron Linux,和Windows agents。
- 每一个机器上有个
jenkins
用户和jenkins
组,而且在所有机器上具有相同的UID和GID。这不是必须的但是让管理agents更容易。 - 每台机器上,Jenkins用户的家目录都在
/var/jenkins
目录。这也不是必须的,但是方便后续维护。 - 所有的机器都运行
sshd
,Windows agents 运行cygwin sshd
- 所有机器上都安装了
/usr/sbin/ntpdate
,用来和NTP服务器同步时间。 - master节点上安装了编译需要的所有工具:Ant, Maven, 以及JDKs。目录结构如下:
/var/jenkins
+- .ssh
+- bin
| +- agent (more about this below)
+- workspace (jenkins creates this file and store all data files inside)
+- tools
+- ant-1.5
+- ant-1.6
+- maven-1.0.2
+- maven-2.0
+- java-1.4 -> native/java-1.4 (symlink)
+- java-1.5 -> native/java-1.5 (symlink)
+- java-1.8 -> native/java-1.8 (symlink)
+- native -> solaris-sparcv9 (symlink; different on each computer)
+- solaris-sparcv9
| +- java-1.4
| +- java-1.5
| +- java-1.8
+- linux-amd64
+- java-1.4
+- java-1.5
+- java-1.8
- master节点上的
/var/jenkins/.ssh
目录具有private/public key 和authorized_keys
,这样master可以通过ssh
在agent上免密执行程序。 - 在master,使用rsync将
/var/jenkins
目录(除了/var/jenkins/workspace
)同步到agents对应的目录 -
/var/jenkins/bin/launch-agent
是一个shell脚本用来在agent上执行job。脚本的作用是在启动agent前创建PATH
变量以及其他的一些事情。
#!/bin/bash
JAVA_HOME=/opt/SUN/jdk1.8.0_152
PATH=$PATH:$JAVA_HOME/bin
export PATH
java -jar /var/jenkins/bin/agent.jar
- 最后所有机器上都安装有编译工具,比如
svn
、git
、cvs
现在大多数Linux发行版安装的Jenkins,默认JENKINS_HOME设置在/var/lib/jenkins
。
四、Scheduling strategy
目前Jenkins主要有两种调度策略:
- 一种是指定编译的agents label
- 另一种是如果一个编译上次使用的这个节点,那么默认下次编译也使用这个节点
参考链接:https://wiki.jenkins.io/display/JENKINS/Distributed+builds