当我们使用 Jenkins 构建的项目达到一定规模后,一个 Jenkins 服务可能承受不了负载,会导致很多的构建任务堆积,严重的话还会拖垮这台服务器,导致上面的服务无法使用。例如我们公司目前在 Jenkins 上要构建的项目多达百个,开发环境需要构建部署,测试环境需要构建部署,甚至正式环境也是,开发环境的部署构建频率是最高的,我们目前的做法是每一个代码的提交都会触发构建操作,单个 Jenkins 已经满足不了频繁的构建的要求了,这时候就需要增加我们 Jenkins 的构建节点,由主节点自己进行调度,将构建任务分配到不同的节点。
这里可能有人会问,我们的项目有必要这么频繁的构建部署吗?答案是肯定的,在持续交付里面有一个理念就是快速的交付可用的产品,要想快速的交付,肯定就免不了需要频繁的构建。一个研发团队能做到短平快的交付才是正常的,是研发效能高的表现。试想一下,现在还有哪个互联网研发团队,一年半载才交付一次产品呢。
配置 Jenkins 的节点也比较简单,准备好要作为 Jenkins 构建节点的服务器,同时要确保服务器上有 git 和构建项目需要的各个工具。例如 Java 栈,就需要确保节点机器上有 JDK、Maven 和 Gradle 等。构建需要的工具可以不用到节点机器上去单独安装,我们可以在 Jenkins 主节点上配置需要的构建工具。
例如我这里在 Jenkins 主节点上,【全局工具配置】里面增加了一个 JDK 工具:
然后去到 Jenkins 的【系统管理】下面的【节点管理】里面,进行【新建节点】:
全部设置如下图:
需要注意的是设置一个工作目录,我这里是 /home/jenkins/jenkins_node_work_dir
,否则 Jenkins 节点上的一些文件就会在用户的 home 目录。【用法】这里选择【只允许运行绑定到这台机器的Job】,如果各个项目的构建方式相同,你可以选择【尽可能的使用该节点】,两者的区别在于机器的环境差异,如果我要构建一个 nodejs 项目,但是只有 A 节点才有 nodejs 环境,那么就要将 nodejs 项目的构建任务绑定到 A 节点,否则其他机器没有 nodejs 环境是没法构建项目的,同理如果项目必须要在 Mac 系统上构建,那么节点也必须是 Mac 系统才行,推荐的设置是将其设置为【尽可能的使用该节点】,如果某些构建任务需要用到特定的构建节点,在该各自的任务上设置即可。这样的好处是既可以让 Jenkins 根据各个节点的负载情况自行调度使用闲置机器来构建各个节点都能构建的任务,又可以让特定任务绑定在特定的节点上构建。
节点添加好后我们来验证下看看能否正常使用。去到我们之前创建的 jenkins-freestyle-test-task
任务进行如下下设置,如果没有新建一个自由风格的任务:
然后我们连续多次点击【立即构建】就会出现如下效果,该任务在并行构建,并且是多个节点在并行构建:
如果你想让任务绑定到特定的节点上运行,可以在任务的设置里面配置【限制项目的运行节点】,如果有多个节点可以运行该任务可以用或符号连接,例如我这里是 jenkins-node-192.168.31.200 || master
,表示这个任务可以在这两个节点上运行,至于具体怎么调度,Jenkins 自己会做选择,我们不用操心。
到此我们 Jenkins 节点的配置就完成了,如果你有多的闲置机器可以按照介绍的方式都添加上来,提高 Jenkins 的构建能力,多一台机器那么构建能力理论上就增加一倍。
随便我们也看看节点机器上的工作目录有什么变化:
刚添加好节点,会产生这些文件。
[jenkins@asus-centos jenkins_node_work_dir]$ pwd
/home/jenkins/jenkins_node_work_dir
[jenkins@asus-centos jenkins_node_work_dir]$ ls -lah
总用量 1.5M
drwxrwxr-x. 3 jenkins jenkins 42 3月 14 19:54 .
drwx------. 8 jenkins jenkins 189 3月 14 19:54 ..
drwxrwxr-x. 4 jenkins jenkins 34 3月 14 19:54 remoting
-rw-rw-r--. 1 jenkins jenkins 1.5M 3月 14 19:54 remoting.jar
当构建任务被分配到该节点进行构建时产生的文件,workspace 是任务构建目录,和 Jenkins 安装目录下的 workspace 目录一样。tools 目时构建用到的工具目录,例如用到JDK。
总用量 1.5M
drwxrwxr-x. 5 jenkins jenkins 72 3月 14 19:57 .
drwx------. 8 jenkins jenkins 189 3月 14 19:54 ..
drwxrwxr-x. 4 jenkins jenkins 34 3月 14 19:54 remoting
-rw-rw-r--. 1 jenkins jenkins 1.5M 3月 14 19:54 remoting.jar
drwxrwxr-x. 3 jenkins jenkins 30 3月 14 19:57 tools
drwxrwxr-x. 3 jenkins jenkins 27 3月 14 19:57 workspace
[jenkins@asus-centos jenkins_node_work_dir]$ ls tools/ -lah
总用量 0
drwxrwxr-x. 3 jenkins jenkins 30 3月 14 19:57 .
drwxrwxr-x. 5 jenkins jenkins 72 3月 14 19:57 ..
drwxrwxr-x. 3 jenkins jenkins 18 3月 14 19:57 hudson.model.JDK
[jenkins@asus-centos jenkins_node_work_dir]$ ls tools/hudson.model.JDK/ -lah
总用量 0
drwxrwxr-x. 3 jenkins jenkins 18 3月 14 19:57 .
drwxrwxr-x. 3 jenkins jenkins 30 3月 14 19:57 ..
drwxrwxr-x. 7 jenkins jenkins 271 3月 14 19:58 JDK8
[jenkins@asus-centos jenkins_node_work_dir]$ ls tools/hudson.model.JDK/JDK8/ -lah
总用量 26M
drwxrwxr-x. 7 jenkins jenkins 271 3月 14 19:58 .
drwxrwxr-x. 3 jenkins jenkins 18 3月 14 19:57 ..
drwxr-xr-x. 2 jenkins jenkins 4.0K 7月 4 2019 bin
-r--r--r--. 1 jenkins jenkins 3.2K 7月 4 2019 COPYRIGHT
drwxr-xr-x. 3 jenkins jenkins 132 7月 4 2019 include
-rw-rw-r--. 1 jenkins jenkins 17 3月 14 19:58 .installedByHudson
-rw-r--r--. 1 jenkins jenkins 5.0M 6月 12 2019 javafx-src.zip
drwxr-xr-x. 5 jenkins jenkins 185 7月 4 2019 jre
drwxr-xr-x. 5 jenkins jenkins 245 7月 4 2019 lib
-r--r--r--. 1 jenkins jenkins 44 7月 4 2019 LICENSE
drwxr-xr-x. 4 jenkins jenkins 47 7月 4 2019 man
-r--r--r--. 1 jenkins jenkins 159 7月 4 2019 README.html
-rw-r--r--. 1 jenkins jenkins 424 7月 4 2019 release
-rw-r--r--. 1 jenkins jenkins 21M 7月 4 2019 src.zip
-rw-r--r--. 1 jenkins jenkins 114K 6月 12 2019 THIRDPARTYLICENSEREADME-JAVAFX.txt
-r--r--r--. 1 jenkins jenkins 166K 7月 4 2019 THIRDPARTYLICENSEREADME.txt
我这里的节点上没有单独设置和安装 JDK 工具,但是任务用到了 Java 命令 却能正常构建,是因为我在 Jenkins 主节点上添加过 JDK,当其他构建节点需要工具工具时就会自动安装到 tools 目录。当然目前可以在 Jenkins 上配置的工具 有限,只支持如下工具的配置:
对于其他不支持在 Jenkins 管理面板配置的工具,我们可以在节点上自行安装到全局,也可以将工具放到自己喜欢的目录,然后配置环境变量指向到工具目录。
如果你在使用 Jenkins 时遇到什么棘手的问题,欢迎留言讨论。