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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容