掘金 后端 ( ) • 2024-06-20 13:52

theme: smartblue

原文链接:Jenkins Architecture Explained – Beginners Guide

Jenkins architecture and core concepts

该博客涵盖了基本的 Jenkins 架构及其相关组件。如果你是 Jenkins 的初学者,它将帮助你了解 Jenkins 组件如何协同工作以及涉及的关键配置。

什么是 Jenkins?

Jenkins 是一个易于使用的基于 Java 的开源 CI/CD 工具。它已经存在了一段时间,并且一些组织使用它来满足 CI/CD 需求。

重要提示:为了更好地理解 Jenkins,必须了解持续集成和持续交付的概念。

Jenkins 拥有庞大的社区支持和大量的插件,可以与许多开源和企业工具集成,让你的生活变得如此轻松。

Jenkins 通常用于以下用途。

  1. 应用代码和基础设施代码的持续集成
  2. 使用 Jenkins pipeline as code,持续交付流水线将应用部署到不同的环境
  3. 基础设施组件部署和管理
  4. 使用 Jenkins jobs 运行批处理操作
  5. 运行临时操作,例如备份、清理、远程脚本执行、事件触发器等

Jenkins 架构

下图展示了 Jenkins 的整体架构。

Jnekins architecture explained

以下是 Jenkins 中的关键组件

  1. Jenkins Master Node
  2. Jenkins Agent Nodes / Clouds
  3. Jenkins Web Interface

Jenkins Master (Server)

Jenkins 的服务器或 Master 节点保存所有关键配置。 Jenkins Master 服务器就像一个控制服务器,负责编排流水线中定义的所有工作流。例如,调度 Jobs 、监控 Jobs 等。

让我们看一下 Jenkins master 的关键组件。

Jenkins Jobs

Jobs 是一系列步骤的集合,可用于构建源代码、测试代码、运行 shell 脚本、在远程主机中运行 Ansible role 或执行 terraform play 等。我们通常将其称为 Jenkins Pipeline

Jenkins job steps

如果将上述步骤转换为 Jenkins Pipeline Jobs ,则如下所示。

Jenkins pipeline job example.

有多种 Jobs 类型可支持你的持续集成和持续交付工作流。

Jenkins 插件

插件是社区开发的模块,你可以将其安装在 Jenkins 服务器上。它可以帮助你使用 Jenkins 本身不提供的更多功能。

例如,如果你想从 Jenkins 将文件上传到 s3 存储桶,你可以安装 AWS Jenkins 插件并使用抽象的插件功能来上传文件,而不是在 AWS CLI 中编写自己的逻辑。该插件负责错误和异常处理。

以下是 AWS Steps 插件提供的 s3 文件上传功能的示例

Jenkins plugin config example.

你可以从 Jenkins dashbaord 安装 / 升级所有可用插件。对于企业网络,你必须设置 Agent 信息才能连接到插件存储库。

你也可以下载插件文件并复制到 /var/lib/jenkins 文件夹下的 plugins 目录中进行安装。

你还可以开发自定义插件。查看 Jenkins [插件索引](Jenkins Plugin Index)中的所有插件。

Jenkins Global Security

Jenkins 有以下类型的主要身份验证方法。

  1. Jenkins 自己的用户数据库:由 Jenkins 自己的数据库维护的用户集。当我们说数据库时,它都是配置文件(XML 文件)
  2. LDAP 集成:- 使用公司 LDAP 配置进行 Jenkins 身份验证
  3. SAML 单点登录 (SSO):支持使用 Okta、AzureAD、Auth0 等提供商的单点登录

借助 Jenkins 基于矩阵(matric-based)的安全性,你可以根据用户在 Jenkins 上拥有的权限进一步向用户分配角色。

Jenkins 凭证

设置 Jenkins Pipeline时,在某些情况下需要使用 Secrets 连接到云帐户、服务器、数据库或 API 端点。

在 Jenkins 中,你可以将不同类型的 Secrets 保存为凭证。

  1. Secret text
  2. Username & password
  3. SSH keys

所有凭证均由 Jenkins 加密 (AES)。 Secrets 存储在 $JENKINS_HOME/secrets/ 目录中。保护此目录并将其从 Jenkins 备份中排除非常重要。

注意:最佳实践是使用外部机密管理解决方案(例如 Vault)而不是 Jenkins 本机凭据。

Jenkins Nodes/Clouds

你可以配置多个 Agent 节点(Linux/Windows)或云(docker、kubernetes)来执行 Jenkins Jobs 。我们将在 Agent 部分了解更多相关信息。

Jenkins 全局配置

在 Jenkins 全局配置下,你拥有已安装插件的所有配置和本机 Jenkins 全局配置。

此外,你还可以在此部分下配置全局环境变量。例如,你可以将工具(Nexus、Sonarqube 等)URL 存储为全局环境变量并在 Pipeline 中使用它们。这样可以更轻松地进行 URL 更改,并反映在所有 Jenkins Jobs 中。

Jenkins Logs

提供所有 Jenkins 服务器操作的日志信息,包括 Jobs 日志、插件日志、webhook 日志等。

注意:上述组件的所有配置都作为配置文件(XML 文件)存在于 Jenkins 主节点数据目录中。

Jenkins Agent

Jenkins Agent 是实际执行 Jobs 中提到的所有步骤(steps)的工作节点。当你创建 Jenkins Jobs 时,你必须为其分配 Agent 。每个 Agent 都有一个标签(label)作为唯一标识符。

img

当你从主服务器触发 Jenkins Jobs 时,实际执行发生在 Jobs 中配置的 Agent 节点上。

注意:你可以在 Jenkins 服务器中运行 Jobs ,而无需 Jenkins Agent 。在这种情况下,主节点充当 Agent 。但是,建议的方法是针对不同的 Jobs 要求设置 Jenkins master-agent,这样你就不会因 Jobs 所需的任何系统范围的配置更改而损坏 Jenkins 服务器。

你可以将任意数量的 Jenkins Agent 附加到主服务器,并结合 Windows、Linux 服务器甚至容器作为构建 Agent。

此外,你还可以根据用例限制 Jobs 在特定 Agent 上运行。例如,如果你有一个具有 Java 8 配置的 Agent ,则可以将此 Agent 分配给需要 Java 8 环境的 Jobs 。

使用 Agent 没有单一标准。你可以根据项目需求设置工作流程和策略。

Jenkins Master-agent 连接

你可以通过两种方式连接 Jenkins master 和 agent

  1. 使用 SSH 方法:使用 ssh 协议连接到 Agent 。连接是从 Jenkins master 发起的。主设备和 Agent 之间应该通过端口 22 建立连接。
  2. 使用 JNLP 方法:使用 Java JNLP 协议(Java Network Launch Protocol)。在此方法中,Java Agent 从具有 Jenkins 主详细信息的 Agent 启动。为此,主节点防火墙应允许指定 JNLP 端口上的连接。通常分配的端口为 50000。该值是可配置的。

Jenkins Agent 有两种类型

  1. Agent 节点:这些是将配置为静态 Agent 的服务器 (Windows/Linux)。这些 Agent 将始终启动并运行,并与 Jenkins 服务器保持连接。组织使用自定义脚本在不使用时关闭并重新启动 Agent 。通常在晚上和周末。
  2. Agent 云:Jenkins 云 Agent 是动态 Agent 的概念。这意味着,每当你触发 Jobs 时,Agent 就会按需部署为虚拟机 / 容器,并在 Jobs 完成后被删除。当你拥有庞大的 Jenkins 生态系统和持续构建时,此方法可以节省基础设施成本。

下图显示了不同类型的 Agent 和连接类型的视图。

Typed of Jenkins agents and connectivity types.

你可以参考以下教程来了解更多关于 Jenkins 云的知识。

  1. Docker 容器作为构建 Agent
  2. 在 Kubernetes Pod 上设置 Jenkins 构建 Agent

Jenkins 数据

所有 Jenkins 数据都存储在以下文件夹位置。

/var/lib/jenkins/

数据包括所有 Jobs 配置文件、插件配置、 Secrets、节点信息等。与其他工具相比,它使 Jenkins 迁移非常容易。

如果你查看 /var/lib/jenkins/,你会发现大多数配置都是 xml 格式。

每天备份 Jenkins 数据文件夹非常重要。由于某种原因,如果你的 Jenkins 服务器数据损坏,你可以通过数据备份恢复整个 Jenkins。

理想情况下,在生产中部署 Jenkins 时,会将专用的额外卷附加到保存所有 Jenkins 数据的 Jenkins 服务器。

img

Jenkins Web UI

Jenkins 2.0 引入了一个非常直观的 Web 界面,称为 "Jenkins Blue Ocean"。它对所有Pipeline都有良好的视觉表示。

Jenkins Blue ocean web interface

结论

在这篇博客中,我解释了 Jenkins 架构及其关键组件。

我个人喜欢 Jenkins 的巨大社区支持、广泛的官方和社区文档。

我根据自己的经验编写了许多 Jenkins 教程。如果你正在追求 DevOps 工程师的职业生涯,那么这是学习 CI/CD 实践的最佳 DevOps 工具之一。

你可能正在开始学习 Jenkins 或者对其工作流程有一些疑问。