当我们使用 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 时遇到什么棘手的问题,欢迎留言讨论。

节点准备:

mkdir jenkins_node_work_dir \
&& mkdir software \
&& cd software \
&& wget https://rplusoss.oss-cn-qingdao.aliyuncs.com/software/development/oracle-jdk/jdk-8u241-linux-x64.tar.gz \
&& tar -zxvf jdk-8u241-linux-x64.tar.gz

Jenkins 进阶篇 - 节点配置的更多相关文章

  1. Jenkins 进阶篇 - 权限配置

    Jenkins的授权策略 Jenkins 默认的授权策略是[登录用户可以做任何事],也就是人人都是管理员,可以修改所有的设置以及构建所有的任务,不用做任何设置,有账号登录到 Jenkins 系统即可, ...

  2. Jenkins进阶-Slave 节点的配置(11)

    Jenkins的主节点无法满足当前的发布需求,所以我们需要增加一个从节点,我们是本着节约的模式,所以主从节点均需要有任务来进行构建: 1.系统管理->管理节点: 2.添加从节点,管理节点-> ...

  3. Jenkins 进阶篇 - 任务关联

    有时候我们的一个任务里面会进行很多的步骤,例如构建一个后端的 Java 服务,可能会有代码静态扫描,静态扫描通过后会打包成 jar 或者 war 文件,打包成功后可能还会对制品进行存档备份,然后可能会 ...

  4. Jenkins 基础篇-凭证配置

    我们在正式开始使用 Jenkins 之前还要先配置一些凭证,这些凭证的作用主要是用于认证,例如我们要从代码仓库拉取代码,就需要用到代码仓库的账号密码或者密钥:我们要登录远程服务器也需要用户名密码或者密 ...

  5. Jenkins搭建,节点配置

     一.服务器安装jdk和Jenkins 二.安装完成后打开jenkins页面:http://localhost:8080,设置管理员密码后登陆进去. 三.系统管理->全局变量,勾选允许用户注册 ...

  6. Jenkins 进阶篇 - 数据备份

    随着我们的长期使用,Jenkins 系统中的内容会越来越多,特别是一些配置相关的东西,不能有任何丢失.这个时候我们就需要定期备份我们的 Jenkins 系统,避免一些误操作不小心删除了某些重要文件,J ...

  7. Jenkins 进阶篇 - 权限案例实践

    为了演示方便,我这里创建了如下的一些任务,各个任务由包含在对应的目录中树形结构大概如下: jenkins-authority 目录类型任务 ├── dev-project-group 目录类型任务 │ ...

  8. Jenkins 基础篇 - Server 配置

    我们使用 Jenkins 部署服务之前要先配置我们的目标服务器,配置目标服务器也很简单,就是将服务器的 IP.账号密码或者账号密钥配置在 Jenkins中.在演示服务器配置之前我们要先知道 Linux ...

  9. Jenkins 进阶篇 - 参数化构建

    我们在构建任务时经常会遇到这样的情景,一个任务配置好了以后,在后面的构建过程中,又会修改一些配置.例如,我们构建项目的代码可能是拉取指定的分支或者是Tag进行构建,又或者是在构建是需要指定特定的运行平 ...

随机推荐

  1. [Java] Solr & Elasticsearch

    背景 实现网站自带的搜索功能,如淘宝中的商品搜索 全文搜索 数据分类 结构化数据:固定格式或长度有限的数据,如数据库.元数据等 非结构化数据:不定长或无固定格式的数据,如邮件.word文档等 搜索分类 ...

  2. Rsync忽略文件夹或目录

    使用Rsync同步的时候往往会要求对某个文件夹或者文件进行忽略,客户端可以使用--exclude参数来实现对,目录或者文件的忽略 rsync -rltvz --port=873 --exclude & ...

  3. Ansible_使用Ansible galaxy部署角色

    一.介绍Anisble galaxy 1.介绍Ansibleu galaxy 1️⃣:Ansible Galaxy (官网:https://galaxy.ansible.com)是一个Ansible内 ...

  4. 实例:使用playbook实现httpd安装、配置、以及虚拟主机的配置

    一.安装环境配置 1.在控制节点给受控主机配置本地仓库文件 [root@ansible ~]# vim /etc/yum.repos.d/dvd.repo [AppStream] name=appst ...

  5. python基础之常用模块一(sys、greenlet、pymysql、paramiko、pexpect、configparser)

    一.sys模块(内置模块) 用于提供对解释器相关的操作 import syssys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) ...

  6. 将.netcore5.0(.net5)部署在Ubuntu的docker容器中

    环境:     宿主机:winows 10 家庭版     虚拟机管理软件:Hyper-V     虚拟机系统:Ubuntu 20.10     Docker版本:Docker CE 20.10.2 ...

  7. Nginx下配置Https证书详细过程

    一.Http与Https的区别HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高 ...

  8. flink Checkpoint优化

    一.设置最小时间间隔 当flink应用开启Checkpoint功能,并配置Checkpoint时间间隔,应用中就会根据指定的时间间隔周期性地对应用进行Checkpoint操作.默认情况下Checkpo ...

  9. 重新整理 .net core 实践篇—————配置系统之军令状[七](配置文件)

    前言 介绍一下配置系统中的配置文件,很多服务的配置都写在配置文件中,也是配置系统的大头. 正文 在asp .net core 提供了下面几种配置文件格式的读取方式. Microsoft.extensi ...

  10. Log4j实战,依赖分析

    背景 在项目中经常被log4j的各种依赖冲突搞的焦头烂额,久病成良医啊,在这里记录一下我对log4j的理解与分析 log4j 与 log4j2 log4j2是log4j的升级版,二者互不兼容,据说lo ...