Jenkins 分布式部署

一、分布式

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
  • 最后所有机器上都安装有编译工具,比如svngitcvs
    现在大多数Linux发行版安装的Jenkins,默认JENKINS_HOME设置在/var/lib/jenkins

四、Scheduling strategy

目前Jenkins主要有两种调度策略:

  • 一种是指定编译的agents label
  • 另一种是如果一个编译上次使用的这个节点,那么默认下次编译也使用这个节点

参考链接:https://wiki.jenkins.io/display/JENKINS/Distributed+builds

你可能感兴趣的:(Jenkins 分布式部署)