该博客涵盖了基本的 Jenkins 架构及其相关组件。如果您是 Jenkins 的初学者,它将帮助您了解 Jenkins 组件如何协同工作以及涉及的关键配置。
Jenkins 是啥
Jenkins 是一个易于使用的基于 java 的开源 CI/CD 工具。它已经存在了一段时间,很多公司使用它来满足他们的 CI/CD 需求。
重要提示:为了更好地理解 Jenkins,必须了解持续集成和持续交付。
Jenkins 拥有巨大的社区支持和大量插件,可以与许多开源和企业工具集成,让您的生活变得如此轻松。
尽管 GitLab CI 和 GitHub Actions 等 CI/CD 工具越来越受欢迎,并且越来越多的组织为了满足 CI/CD 需求而采用这些工具,但 Jenkins 仍然在许多组织中广泛使用。
根据开发者生态系统报告,54% 的开发者使用 Jenkins 进行 CI/CD。
Jenkins 通常用于以下用途。
- 应用程序和基础设施代码的持续集成。
- 使用持续交付管道(pipeline),使用 Jenkins 管道作为代码将应用程序部署到不同的环境。
- 使用 IaC 工具部署和管理基础设施组件。
- 使用 Jenkins 作业运行批处理操作。
- 运行临时操作,例如备份、清理、远程脚本执行、事件触发器等。
Jenkins 架构
下图显示了 Jenkins 的整体架构和连接工作流程。
以下是 Jenkins 的关键组件:
- Jenkins Master Node
- Jenkins Agent Nodes/Clouds
- Jenkins Web Interface
让我们详细看看每个组件。
Jenkins Server(以前称为 Master)
Jenkins Master Node 保存所有关键配置。Jenkins 主服务器就像一个控制服务器,负责编排管道中定义的所有工作流程。例如,调度作业、监控作业等。
让我们看一下 Jenkins master 的关键组件。
Jenkins Jobs
作业是一系列步骤的集合,可用于构建源代码、测试代码、运行 shell 脚本、在远程主机中运行 Ansible 角色或执行 terraform play 等。我们通常将其称为 Jenkins 管道。
如果将上述步骤转换为 Jenkins 管道作业,则如下所示。
有多种作业类型可支持您的持续集成和持续交付工作流程。
Jenkins Plugins
插件是官方和社区开发的模块,您可以将其安装在 Jenkins 服务器上。它可以帮助您使用 Jenkins 本身不提供的更多功能。
例如,如果您想从 Jenkins 将文件上传到 s3 存储桶,您可以安装 AWS Jenkins 插件并使用抽象的插件功能来上传文件,而不是在 AWS CLI 中编写自己的逻辑。该插件负责错误和异常处理。
以下是 AWS Steps 插件提供的 s3 文件上传功能的示例。
您可以从 Jenkins dashbaord 本身安装/升级所有可用插件。对于企业网络,您必须设置代理才能连接到插件存储库。
您还可以下载插件文件并通过将其复制到 /var/lib/jenkins 文件夹下的 plugins 目录来安装。
您还可以开发自定义插件。查看 Jenkins 插件索引 中的所有插件。
Jenkins 安全
Jenkins 有以下类型的主要身份验证方法。
- Jenkins 自己的用户数据库:- 由 Jenkins 自己的数据库维护的用户集。当我们说数据库时,它指的是 Jenkins 的 XML 配置文件。
- LDAP 集成:使用公司 LDAP 进行 Jenkins 身份验证。
- SAML 单点登录 (SSO):支持使用 Okta、AzureAD、Auth0 等提供商的单点登录。
借助 Jenkins 的安全能力,您可以根据用户在 Jenkins 上拥有的权限进一步向用户分配角色。
Jenkins 凭证
设置 Jenkins 管道时,在某些情况下需要使用密钥连接到云帐户、服务器、数据库或 API 端点。
在 Jenkins 中,您可以将不同类型的秘密保存为凭证。
- 秘密文本
- 用户名、密码
- SSH Key
所有凭证均由 Jenkins 加密 (AES)。机密存储在 $JENKINS_HOME/secrets/
目录中。保护此目录并将其从 Jenkins 备份中排除非常重要。
注意:最佳实践是使用外部机密管理解决方案(例如 Vault)而不是 Jenkins 本机凭据。
Jenkins Nodes/Clouds
您可以配置多个代理节点(Linux/Windows)或云(docker、kubernetes)来执行 Jenkins 作业。我们将在代理部分了解更多相关信息。
Jenkins 全局配置
在 Jenkins 全局配置下,您能看到已安装插件的所有配置和本机 Jenkins 全局配置。
此外,您还可以在此部分下配置全局环境变量。例如,您可以将工具(Nexus、Sonarqube 等)URL 存储为全局环境变量并在管道中使用它们。这样可以更轻松地进行 URL 更改,并反映在所有 Jenkins 作业中。
Jenkins Logs
提供所有 Jenkins 服务器操作的日志信息,包括作业日志、插件日志、webhook 日志等。
注意:上述组件的所有配置都作为配置文件(XML 文件)存在于 Jenkins 主节点数据目录中。
Jenkins Agent
Jenkins 代理是实际执行作业中提到的所有步骤的工作节点。当您创建 Jenkins 作业时,您必须为其分配代理。每个代理都有一个标签作为唯一标识符。
当您从主服务器触发 Jenkins 作业时,实际执行发生在作业中配置的代理节点上。
注意:您可以在 Jenkins 服务器中运行作业,而无需 Jenkins 代理。在这种情况下,主节点充当代理。但是,建议的方法是针对不同的作业要求设置 Jenkins 主代理,这样您就不会因作业所需的任何系统范围的配置更改而损坏 Jenkins 服务器。
您可以将任意数量的 Jenkins 代理附加到主服务器,可以使用 Windows、Linux 服务器甚至容器作为构建代理。
此外,您还可以根据用例限制作业在特定代理上运行。例如,如果您有一个具有 java 8 配置的代理,则可以将此代理分配给需要 Java 8 环境的作业。
使用代理没有单一标准。您可以根据项目需求设置工作流程和策略。
Jenkins server-agent 连接
您可以通过两种方式连接 Jenkins master 和 agent。
- SSH:使用 ssh 协议连接到代理。连接是从 Jenkins master 发起的。主设备和代理之间应该通过端口 22 进行连接。
- JNLP:使用java JNLP协议(Java网络启动协议)。在此方法中,Agent node 需要知晓 Master 的地址。主节点防火墙应允许指定 JNLP 端口上的连接。通常分配的端口为 50000。该值是可配置的。
Jenkins 代理有两种类型。
- Agent Nodes:服务器配置为静态代理,可能是 Windows 或 Linux 系统。这些代理将始终启动并运行,并与 Jenkins 服务器保持连接。各个公司一般使用自定义脚本在不使用时关闭并重新启动代理。通常在晚上和周末。
- Agent Clouds:Jenkins Cloud 代理是动态代理的概念。这意味着,每当您触发作业时,代理就会按需部署为虚拟机/容器,并在作业完成后被删除。当您拥有庞大的 Jenkins 生态系统和持续构建时,此方法可以节省基础设施成本。
下图显示了不同类型的代理和连接类型的高视角视图。
您可以参考以下教程来了解更多关于Jenkins云的知识。
- Docker 容器作为构建代理。
- 在 Kubernetes Pod 上设置 Jenkins 构建代理。
Jenkins Data
所有 Jenkins 数据都存储在以下文件夹位置。
/var/lib/jenkins/
数据包括所有作业配置文件、插件配置、秘密、节点信息等。与其他工具相比,它使 Jenkins 迁移非常容易。
如果您查看/var/lib/jenkins/,您会发现大多数配置都是 xml 格式。
每天备份 Jenkins 数据文件夹非常重要。由于某种原因,如果您的 Jenkins 服务器数据损坏,您可以通过数据备份恢复整个 Jenkins。
理想情况下,在生产中部署 Jenkins 时,建议为 /var/lib/jenkins
挂载一个网盘。
Jenkins Web Interface
Jenkins 2.0 引入了一个非常直观的 Web 界面,称为“Jenkins Blue Ocean”。它对所有管道都有良好的视觉表示。