1. 概述

在本教程中,我们将回顾 Jenkins 架构的基础知识。此外,我们将学习如何配置 Jenkins 来提高性能。此外,我们将讨论手动重新启动或关闭 Jenkins 的选项。

2.詹金斯架构

一台 Jenkins 服务器无法满足某些需求。首先,我们可能需要多个不同的环境来测试我们的构建。单个 Jenkins 服务器无法做到这一点。其次,如果定期生成更大、更重的项目,单个 Jenkins 服务器将不堪重负。

Jenkins分布式架构就是为了满足上述需求而创建的。此外, Jenkins 使用主从架构来管理分布式构建 。本设计中Master和Slave之间采用TCP/IP协议进行通信。

2.1.詹金斯大师

Jenkins master 负责调度作业、分配 Slave 并将构建发送给 Slave 来执行作业。它还将跟踪从属状态(离线或在线)并检索来自从属的构建结果响应并将其显示在控制台输出上。

2.2.詹金斯奴隶

它在远程服务器上运行。 Jenkins 服务器遵循 Jenkins master 的请求,并与所有操作系统兼容 。由主站调度的构建工作由从站执行。此外,还可以将项目配置为选择特定的从机。

2.3.分布式主从架构

让我们通过一个示例来了解一下 Jenkins 架构。下图描述了一个 master 和三个 Jenkins Slave:

让我们看看如何利用 Jenkins 在各种系统(例如 Ubuntu、Windows 或 Mac)中进行测试:

在该图中,考虑了以下项目:

  • Jenkins 将定期检查 GIT 存储库中源代码的任何更改
  • 每个 Jenkins 构建都需要自己的测试环境,无法在单个服务器上创建。詹金斯通过根据需要雇用各种奴隶来实现这一点
  • Jenkins Master 将向这些从机传达测试请求以及测试报告

3. 詹金斯 CLI

Jenkins 有一个命令行界面,用户和管理员可以使用该界面从脚本或 shell 环境访问 Jenkins。 SSH、Jenkins CLI 客户端或 Jenkins 附带的 JAR 文件可以使用此命令行界面

为此,我们必须首先从 Jenkins 控制器的 URL /jnlpJars/jenkins-cli.jar 下载 jenkins-cli.jar ,实际上 是 JENKINS_URL/jnlpJars/jenkins-cli.jar, 然后按如下方式运行它:

java -jar jenkins-cli.jar -s http://localhost:8080/ -webSocket help

通过从“管理 Jenkins”页面的“工具和操作”部分选择“Jenkins CLI”即可使用此选项:

该区域显示可用命令的列表。我们可以使用命令行工具使用这些命令来访问各种功能。

4. 手动重启Jenkins

如果我们希望手动重启或关闭 Jenkins,只需按照以下步骤操作:

4.1.重新开始

我们可以使用 Jenkins Rest API 执行重启。这将强制该过程重新启动,而无需等待现有作业完成:

http://(jenkins_url)/restart

我们可以使用 Jenkins Rest API 执行 safeRestart 。这使我们能够完成任何现有任务:

http://(jenkins_url)/safeRestart

如果我们将其安装为 rpmdeb 软件包,则以下命令将起作用:

service jenkins restart

4.2.乌班图

我们还可以使用 apt-get/dpkg 来安装以下内容:

sudo /etc/init.d/jenkins restart
Usage: /etc/init.d/jenkins {start|stop|status|restart|force-reload}

4.3.安全关闭 Jenkins

如果我们希望安全地关闭 Jenkins,我们可以使用 Jenkins Rest API 执行退出:

http://(jenkins_url)/exit

我们可以使用 Jenkins Rest API 执行kill来终止所有进程:

http://(jenkins_url)/kill

5. 提升 Jenkins 性能

滞后或响应缓慢是 Jenkins 用户的典型抱怨,并且有很多报告的故障。缓慢的 CI 系统很不方便,因为它们会减慢开发速度并浪费时间。使用一些简单的建议,我们可以提高这些系统的性能。

在接下来的部分中,我们将讨论一些改进 Jenkins 并让我们的工程师脸上露出笑容的建议。

5.1.最小化主节点上的构建

主节点是应用程序实际执行的地方;它是詹金斯的大脑,与奴隶不同,它无法被取代 。因此,我们希望让 Jenkins master 尽可能“无工作”,使用 CPU 和 RAM 来调度和触发 Slave 上的构建。我们可以通过将作业限制为节点标签来实现这一点,例如 SlaveNode

为管道作业分配节点时,使用标签,例如:

stage("stage 1"){
    node("SlaveNode"){
        sh "echo \"Hello ${params.NAME}\" "
    }
}

在这些情况下,任务和节点块将仅在具有 SlaveNode 标签的从属设备上运行。

5.2.不要保留太多构建历史

在配置作业时,我们可以指定要在文件系统上保留多少个构建以及保留多长时间。当我们快速触发一个作业的多个构建时,这个称为“丢弃旧构建”的功能就会变得有用。

我们已经看到过历史限制设置得太高的例子,导致保存过多的构建。此外,在这种情况下,詹金斯必须加载大量旧版本。

5.3.清除旧的 Jenkins 数据

继续之前关于构建数据的建议,另一个需要了解的关键要素是旧的数据管理功能。我们可能知道,Jenkins 管理作业并将数据存储在文件系统上。当我们采取升级核心、安装或更新插件等操作时,数据格式可能会发生变化。

在这种情况下,Jenkins 将旧数据格式保存到文件系统并将新格式加载到内存中。如果我们需要回滚升级,这是非常有用的,但有时 RAM 中加载的数据过多。 UI 响应缓慢甚至内存不足问题都是内存使用率过高的迹象。建议打开之前的数据管理页面,避免出现此类情况:

5.4.定义正确的堆大小

当前许多 Java 应用程序都使用最大堆大小选项。定义堆大小时需要注意 JVM 的一个重要方面。 UseCompressedOops 是此功能的名称,它仅适用于我们大多数人使用的 64 位平台。它将对象的指针从 64 位减少到 32 位,从而节省了大量的内存。

默认情况下,此标志在大小高达 32GB(略小)的堆上启用,并且在大于该值的堆上停止工作。堆应扩展到 48GB 以补偿损失的容量。因此,在定义堆大小时,建议将其保持在 32GB 以下。

我们可以使用以下命令( jinfo 包含在 JDK 中)来查看该标志是否已设置:

jinfo -flag UseCompressedOops <pid>

5.5.调整垃圾收集器

垃圾收集器是一个在后台运行的内存管理系统。

它的主要目标是找到堆中未使用的对象并释放它们所包含的内存。 Java 应用程序可能会因某些 GC 操作而停止(还记得 UI 冻结吗?)。如果我们的应用程序有一个巨大的堆(超过 4GB),这种情况最有可能发生。为了减少这些情况下的延迟时间,需要对GC进行优化。在处理多个 Jenkins 设置中的这些挑战后,我们提出了以下建议:

  • 启用G1GC — 最新的 GC 实现(JDK9 上默认)
  • 启用GC 日志记录– 这将有助于将来的监控和调整
  • 如有必要,请使用额外标志配置 GC
  • 持续监控

六,结论

在这个快速教程中,我们首先讨论了 Jenkins 中的分布式主从架构。之后,我们研究了手动启动、停止和重新启动 Jenkins 的几个选项。最后,我们探索了 Jenkins 中的不同配置来提高性能。

如果我们花一些时间在 Jenkins 上并遵循这些准则,我们将能够利用它的许多有用的功能,同时避免潜在的危险。