什么是 Jenkins?关键概念与教程(翻译)

430 阅读21分钟

原文链接:spacelift.io/blog/what-i…

image.png

Jenkins 旨在简化软件交付过程。作为一个适用于各种软件工程任务的多功能平台,它主要用于管理 CI/CD 流水线,以确保变更得到有效验证和部署。

在本文中,我们将探讨 Jenkins 在现代软件开发中的关键特性、优势和实际应用及其在 DevOps 实践中的作用。

 我们将讨论:

  1.  什么是 Jenkins?
  2.  Jenkins 如何工作?
  3. Jenkins 核心概念和功能
  4. 使用 Jenkins 的好处是什么?
  5. Jenkins 的缺点是什么?
  6. 教程:如何使用 Jenkins?
  7. 与 Jenkins 协作的最佳实践
  8. 替代通用 CI/CD 工具

 什么是 Jenkins?

Jenkins 是一个用于实现持续集成和持续交付(CI/CD)流程的开源自动化平台。它通过执行由新提交、分支和拉取请求等事件触发的作业来自动化构建、测试和部署任务。其高度可扩展的插件架构能够与众多工具和技术无缝集成。作为一个基于 Java 的应用程序,Jenkins 兼容多个操作系统,包括 Windows、Linux 和 macOS。

jenkins commit

Jenkins 用于什么?

Jenkins 用于构建、测试和部署软件项目以及自动化 CI/CD 管道。它在多个开发阶段协调复杂的工作流程,并与软件开发生命周期中的各种工具和技术集成。Jenkins 还可以监控和报告构建和部署过程。

Jenkins 是 CI 还是 CD 工具?

Jenkins 主要是一种用于持续集成(CI)的工具,但也可以用于持续交付(CD)。

CI 鼓励开发团队将正在开发的源代码集成到版本控制系统中,以便负责构建和运行测试用例的自动化流水线能够快速反馈给开发人员。CI 的关键重点是尽快提供此反馈,以便开发人员在部署到生产 / 更高环境之前修复错误并主动降低风险。

CD 是一种使用自动化管道来管理软件发布的实践。它涉及使用工具来促进部署工件依赖关系的创建,并以可重复和可靠的方式设置环境特定的变量。持续交付不同于持续部署,因为它在将新的软件构建部署到生产环境之前需要手动批准。

 Jenkins 如何工作?

jenkins pipeline

Jenkins 与 Git 代码库集成,开发人员在其中协作并提交代码更改。Jenkins 获取这些更改以自动启动构建过程,该过程涉及编译、测试和错误报告,作为开发人员的反馈循环。这使得开发生命周期的周转时间更快,而不影响生产。

作为持续交付的一部分,您还可以使用各种自动化任务来管理依赖关系并将部署工件推送到适当的存储库。工件的例子包括 Java 程序所需的 jar 文件和基于容器部署的容器镜像。

由于该工具是开源且可扩展的,它使 Jenkins 社区能够开发出一个强大的插件生态系统。许多插件可用于与版本控制、源代码管理、构建、测试框架、部署目标、报告等相关的特定任务。这种模块化方法还允许组织创建灵活且高度定制的流水线。

Jenkins 核心概念和功能

要完全理解 Jenkins,掌握某些概念非常重要。下面的列表将帮助你快速掌握构建基本流水线的知识,我们将在接下来的章节中讨论这些内容。

注意:这不是一个详尽的功能列表。

 1. Jenkins 管道

Jenkins 流水线表示使用多种工具为 CI/CD 构建的端到端工作流。它定义了通过各种环境自动构建、测试和交付 / 部署应用程序所需的步骤。

管道使用 YAML 文件定义,在 Jenkins 的上下文中,该文件名为 “Jenkinsfile”。创建 CI/CD 管道确保标准化,强制执行最佳实践,促进轻松协作,并加快新应用功能的交付。

下图显示了 Jenkins 流水线示例:

jenkins pipeline example

图片来源

2. 在 Jenkins 中构建

在 Jenkins 中,构建是指应用程序源代码被编译、测试并打包成可部署的工件的阶段。构建可以手动或自动触发,其中 Jenkins 自动化服务器会轮询源代码库中的更改。构建涉及各种子任务,例如编译代码、运行单元测试、静态代码分析、文档生成等。

根据正在开发的软件编程语言,有各种插件可用于支持 Jenkins 中的构建过程。同样,根据部署类型,各种类型的工件会在预定义位置进行版本控制、创建和保存。

 3. Jenkins 触发器

顾名思义,触发器是启动构建或部署流水线的操作或事件。Jenkins 支持各种类型的触发器。以下是一些示例:

  1. SCM 触发器:Jenkins 轮询 SCM 存储库中的更改。当发现更改时,Jenkins 开始执行流水线作业并处理最新的源代码。
  2. 参数化触发器:此触发器允许根据用户定义的输入触发构建。
  3. 手动触发器:您可能需要通过登录到 Jenkins 环境来显式触发管道。
  4. 基于时间的触发器:可以根据特定的时间表运行流水线。一个 cron 作业被设置为在每个设定的间隔后启动流水线执行。
  5. Webhooks:当流水线运行取决于外部平台中发生的某些事件时,我们可以使用 webhooks 来触发 Jenkins 中的流水线执行。

 4. Jenkins 工件

工件是从构建过程中产生的文件,用于部署或报告目的。各种运行时环境需要各种类型的可执行文件和二进制文件,这些文件通常是编译和构建过程的结果。

Jenkins 提供了工件管理,允许用户在 Jenkins 服务器本地或外部平台上发布或存档。这提高了软件开发过程中的可追溯性、可重复性和可靠性。

 5. Jenkins 代理

jenkins agents

代理是 Jenkins 用来执行流水线任务的基础设施组件。流水线运行需要计算资源来运行执行步骤中指定的脚本和命令。除了在 Jenkins 服务器上本地执行外,还可以在其他本地服务器、虚拟机或容器化环境中运行构建任务。

事实上,强烈建议不要在安装 Jenkins 的服务器上执行构建任务。这些资源 / 虚拟机称为代理。代理有助于将 Jenkins 的操作扩展到单个团队之外,以满足项目 / 组织级别的自动化和构建需求。

6. Jenkins 管道阶段

阶段为在 Jenkins 中组织和可视化流水线的工作流程提供了逻辑结构。这使开发人员能够将复杂的 Jenkins 流水线分成明确的阶段,有助于调试或排查问题。一个阶段代表流水线的一个阶段。

例如,我们可以有构建、测试和部署阶段。每个阶段进一步包含完成该阶段预期任务的作业。一般来说,Jenkins 中的阶段为流水线提供了逻辑结构。

阶段显示在 “阶段视图” 中

jenkins stage view

7. Jenkins 作业(项目)

一个作业代表了由流水线按特定顺序执行的一组预定义操作。例如,构建过程涉及多个作业 —— 构建、测试、推送等 —— 这些是 Jenkins 流水线的构建模块。我们可以配置作业来运行各种脚本和命令。在 Jenkins 中,作业接受各种参数输入,并且您可以使用它们定义复杂的工作流。

8. Jenkins 流水线中的步骤

步骤是 Jenkins 流水线中最小的工作单元。脚本中编写的每个命令或行都是一个步骤。Jenkins 支持广泛的内置和插件提供的步骤,以及使用 Groovy 语言编写自定义步骤的能力。

为了更好地理解阶段、作业和步骤,Jenkins 流水线由多个阶段定义。每个阶段包含多个作业,每个作业由使用脚本语言编写的多个步骤定义。

 9. Jenkins 插件

一个典型的 Jenkins 安装包含核心平台。插件扩展其功能,为各种用例提供额外的功能和集成。

Jenkins 插件在流水线和平台管理的所有阶段提供了广泛的功能。可以通过插件将各种第三方系统与 Jenkins 集成。也可以开发自定义插件。插件利用可重用性,从而提高开发团队的生产力和效率。

10. Jenkinsfile

Jenkinsfile 是一个文本文件,用代码的形式向 Jenkins 服务器描述流水线。每个使用 Jenkins 进行 CI/CD 的项目在项目的根目录中都有这个文件,并且通常会提交到源代码库中。它使 Jenkins 服务器理解每个阶段要执行的步骤顺序。这个文件提供了一种以版本控制和可重现的方式定义流水线的方法,使团队能够与应用程序代码一起管理其交付过程。

以下是一个用于持续交付流水线的 Jenkinsfile 示例,其中包含三个阶段:

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

Jenkins 的架构是什么?

Jenkins 核心是使用 Java 编程语言开发的。Jenkins 服务器的简单安装由各种内部组件组成,这些组件管理与外部应用程序(如 CLI、请求、代理等)的通信和处理请求。

下图显示了所有重要的 Jenkins 组件:

jenkins architecture

图片来源

我们将在下面回顾一些重要方面,以便更好地理解 Jenkins 的内部工作原理。

JENKINS_HOME

在安装了 Jenkins 的服务器上,所有用于管理和配置插件和流水线、构建工件、运行时数据等的文件都存储在名为 “JENKINS_HOME” 的特定目录中。根据操作系统的不同,该目录的确切路径可能会有所不同。存储在此目录中的配置文件确保在服务器重启时持久存在。这在灾难恢复和创建备份时也很有帮助。

 业务层

这一层负责管理核心活动,如作业和用户管理、构建执行和插件集成。业务层处理这些组件之间的交互以及来自外部系统的传入请求。

每个触发流水线执行的传入请求都会经过权限验证,将操作委派给代理机器,向相关系统提供状态更新,并处理通知。Jenkins 架构图中显示的业务层是执行基础工作的核心系统,抽象了复杂性。

 订书机网络框架

在上图中,Jenkins 通过 CLI、端点和 Web 界面实现 HTTP 通信。Stapler Web 框架负责处理传入的 HTTP 请求并生成动态 Web 内容。它将 URL 和请求体映射到相应的 Java 类,这一点非常重要。这使得开发新的 Jenkins 插件变得更加容易,因为通信模式由 Stapler Web 框架标准化。

 远程处理

在 Jenkins 架构中,远程组件是一个可执行的 JAR 文件,负责 Jenkins 核心与代理之间的通信。它通过将构建任务分配给多个代理,实现了构建执行的去中心化。这也允许并行执行,从而提高了可扩展性。

💡 你可能还喜欢:

使用 Jenkins 的好处是什么?

由于其灵活性、广泛的插件生态系统和强大的社区支持,Jenkins 仍然很受欢迎。它提供了与各种工具的轻松集成,有效地自动化 CI/CD 流水线,并支持分布式构建。作为开源且免费的软件,Jenkins 为各种规模的组织提供了具有成本效益的解决方案。其成熟性、可靠性和持续改进使其成为自动化软件开发流程的可信选择。

让我们更详细地看看 Jenkins 的好处:

CI/CD 自动化平台从本质上讲,Jenkins 是一个自动化平台,促进 CI/CD 实践并支持频繁的代码集成、测试和部署。开发人员可以自动触发自动化工作流来构建、测试和部署代码更改。Jenkins 提供了执行特定任务的各种可能性,这种灵活性扩展到端到端的流程实现。 
可扩展性和分布式构建Jenkins 旨在处理大型项目。分布式构建架构允许开发人员利用多个构建代理,从而实现并行任务执行,从而显著减少构建时间。这种可扩展性对于处理大型项目、具有众多依赖项的项目或地理位置分散的团队来说是非常有利的。 
插件生态系统庞大的插件生态系统促进了 Jenkins 的成功采用。在 Jenkins 上实现自动化流水线时,许多插件可用于完成各种任务。一些插件经常使用的例子包括版本控制系统、将代码部署到云平台、通知等。 
协作与可见性Jenkins 通过提供一个集中平台来监控和管理构建、测试和部署,从而实现开发团队之间的协作。其网页界面提供了实时构建状态、测试报告和项目进展的视图。这对于透明度和可见性至关重要,促进了更好的沟通和更快的问题解决。 
性价比高且开源Jenkins 提供了一个专有工具的开源替代方案,使其对各种规模的组织都可访问。活跃的社区支持确保了平台的持续改进,从而以一种具有成本效益的方式利用自动化功能,否则从供应商锁定和维护的角度来看,这将是昂贵的。 

Jenkins 的缺点是什么?

使用 Jenkins 的主要挑战包括性能和可扩展性问题、复杂的配置和维护以及插件管理的困难。Jenkins 还可能资源密集,导致构建速度慢,如果配置不当,还可能存在安全漏洞。

以下是 Jenkins 的最大限制:

复杂设置虽然 Jenkins 是有助于成本效益的开源软件,但其缺点是设置和维护操作。它是最古老的自动化平台之一,设置和管理需要大量时间和精力。回滚和自动备份不像同类软件那样简单,因此需要特别注意。简而言之,设置 Jenkins 相当复杂。 
插件生态系统正如开源既可以是优势也可以是缺点一样,插件生态系统也可以是福也是祸。一方面,利用第三方插件可能会节省时间,但另一方面,你需要确保插件是最新的。较新的版本还可能引入破坏性更改或不兼容问题。 
安全漏洞Jenkins 的核心平台有着关键漏洞的历史,这些漏洞可能导致远程代码执行、任意文件读取访问、XSS 等。这些安全漏洞要求管理员保持 Jenkins 服务器的最新状态,这增加了设置和操作的复杂性。 
过时的 UI/UXJenkins UI 几乎没有收到任何升级,用户体验也不符合当今的标准。它提供了基本的导航功能,但并不直观或现代。 

教程:如何使用 Jenkins?

让我们在本地托管的 Jenkins 服务器上构建一个带有流水线的简单 Jenkins 项目。在这个实践练习中,我们将涉及本文中讨论的各种组件。

如果你没有安装 Jenkins 服务器,请在继续之前按照此处的说明进行操作。

使用 Jenkins 涉及以下步骤:

  1. 登录到 Jenkins 仪表板。
  2. 创建一个 Jenkins 流水线。
  3. 配置管道选项。
  4. 创建一个流水线脚本。
  5. 触发流水线运行。

步骤 1:登录 Jenkins 仪表板

当您第一次安装 Jenkins 时,系统会要求您设置管理员用户的登录凭据。使用这些凭据登录到 https://localhost:8080 上的 Jenkins 服务器。.

登录后,您将在 Jenkins Web UI 中看到一个仪表板,如下所示。如果您是全新安装,您将不会看到任何流水线。

jenkins views

步骤 2:创建 Jenkins 流水线

从菜单中点击 “New Item” 按钮。您将看到一个选择 “Item” 类型的屏幕。如下面的图片所示,选择 “Pipeline” 并为此管道命名。点击 “OK”,您将被重定向到配置页面。

create jenkins pipeline

步骤 3:配置管道选项

在常规选项卡上,您将看到与参数化、SCM 集成、构建并发性等相关的几个配置选项,如下所示。您还应该看到一个单独的部分,用于设置各种类型的构建触发器。我们现在可以暂时不更改这些配置选项。

configure jenkins

步骤 4:创建一个流水线脚本

向下滚动到 Pipeline 部分。在这里,您有两种创建管道脚本的选项:从 SCM 获取它们或自己编写。我们没有配置任何 SCM,因此我们将在以下脚本块中编写我们简单的管道脚本:

jenkins project options

 添加以下脚本:

pipeline {
    agent any
    stages {
        stage('Stage 1') {
            steps {
                echo 'Pulling source code from SCM'
                // more steps
            }
        }
        stage('Stage 2') {
            steps {
                echo 'Compiling source code.'
                // build commands
            }
        }
        stage('Stage 3') {
            steps {
                echo 'Running tests'
                // run unit test cases
            }
        }
    }
}

这是一个用 Groovy 编写的非常基本的表示性流水线脚本。最外层的括号表示流水线本身。然后我们将 agent 属性定义为 “any”,因为我们目前可以在任何可用的代理上运行此流水线。

在这种情况下,代理也运行在与 Jenkins 服务器相同的机器上,因为我们没有明确配置任何代理。代理属性后面是连续的阶段块,这些阶段块依次定义了每个阶段要执行的步骤。

上面的管道模拟了三个阶段:

  1. 阶段 1 – 从 SCM 拉取源代码。需要 SCM 配置和额外步骤。
  2. 阶段 2 – 编译拉取的源代码。
  3. 阶段 3 – 对编译后的代码运行单元测试。

 点击 “保存”。

步骤 5:手动触发流水线

导航到新创建的管道,您将看到如下各种选项:

jenkins gui view

如果您想重新查看上一步的配置,请点击 “配置”;否则,请点击 “立即构建” 以触发管道执行。接下来的屏幕将显示所有管道运行的图形摘要,如下所示:

build jenkins pipeline

在这里,我们可以理解为流水线已经运行了两次,并且第二次运行成功。要查看第二次运行的日志,请在构建历史记录下点击 “#2”,然后点击 “控制台输出”。

jenkins console output

我们已经成功地在 Jenkins 中运行了一个非常基础的流水线!

建议您探索 Jenkins 界面,配置 SCM,探索插件,并构建更有意义的流水线。首先,请查看我们的《使用 Jenkins 管理 Terraform》教程。.

与 Jenkins 协作的最佳实践

以下是使用 Jenkins 时的一些最佳实践的快速回顾:

  1. 限制访问并保护 Jenkins 使用的配置文件,因为它们可能包含敏感信息。建议您使用凭证插件来管理用于自动化的服务账户凭证。
  2. 将 Jenkinsfile 视为代码并提交到 SCM。这使得管道定义的版本控制成为可能,并有助于轻松回滚、团队协作和可追溯性。
  3. Jenkins 是关于自动化的。配置触发器以自动化管道构建。
  4. 配置管道在执行的初始阶段失败,并实现信息日志消息。这使开发人员能够快速理解错误,从而专注于修复错误,以更快和更可靠的软件交付。
  5. 定期备份 Jenkins 配置,以便在发生灾难时,恢复结果将信息损失降到最低。
  6. 利用插件更快地构建流水线,除非绝对必要,否则不要从头开始构建。

使用 Spacelift 管理你的 IaC

Spacelift 是一个基础设施即代码(IaC)管理平台,适用于 OpenTofu、Terraform、Terragrunt、CloudFormation、Pulumi、Kubernetes 和 Ansible 资源。它为您的基础设施更改提供了自动化的 CI/CD 工作流 —— 无需编写不稳定的管道脚本来应用您的 Terraform 计划或 Kubernetes 部署!

使用 Spacelift 可以消除基础设施管理中繁琐且风险较大的部分。与在 Jenkins 中手动配置这些工作流相比,Spacelift 更简单,提供了更好的可见性和合规性,并且更容易在不同的 IaC 提供商和云平台之间扩展。

让我们来看看它如何克服通用 CI/CD 工具的限制:

  • 无需控制状态文件:Spacelift 可以为你管理后端和状态文件。你需要在创建堆栈时声明你想要控制的技术。.

jenkins example

这意味着你不再需要担心它。如果你仍然希望操纵状态,你可以运行如下所示的任务。

然而,强烈不建议操作状态文件,除非有严重的理由,否则不应进行操作。通过操作状态文件,您会危及整个基础设施配置。

jenkins terraform spacelift example

  • 状态锁也由 Spacelift 解决。所有运行都受到控制,两个运行不能同时访问同一资源。

  • 背景配置(如状态文件)已被管理。

  • Spacelift 提供适当的编排功能:

    • 空间,您可以轻松地镜像您的云环境,并在团队 / 环境 / 账户之间进行清晰的划分。每个空间都可以适用于不同的策略和设置。
    • 上下文为多个堆栈提供了总体变量集。
    • 资源帮助您了解您部署了什么以及哪里可能存在配置漂移。
    • 运行时配置可能有助于检查新版本 IaC 工具的兼容性。
    • 政策是 Spacelift 中的一个关键概念。此功能有助于通过一组特定的检查点来控制工作流程。
    • Terraform 注册表是您可以存储、管理和控制您的 Terraform 模块和提供程序的地方。使用通用的 CI/CD 工具,您必须在您的链中引入另一个工具,而 Spacelift 内置了此服务。
    • 堆栈依赖性在多个模板依赖于其他模板时非常有用。使用 Spacelift,您可以创建一个包含无限数量堆栈的明确执行链。将基础设施的创建区分并连接在预生产账户和生产账户上是有帮助的。或者,如果您有很多层,您可以简单地构建预生产网络、预生产数据库、生产网络和生产数据库堆栈之间的依赖关系。这样,您的基础设施堆栈就像在真实环境中一样彼此连接。
  • 你不需要多步骤的流水线或针对不同用例的多条流水线。如果你想利用拉取请求功能,Spacelift 内置了拉取请求管理。使用通用的 CI/CD 工具,你需要一个单独的流水线来检测漂移。而使用 Spacelift,你可以轻松检测漂移而无需额外的流水线。

  • 自助服务方法内置于 Spacelift 中。我已经提到过 Terraform 注册表、Spaces 和 Policies 等元素,但最重要的是,Spacelift 提供 Blueprints。这是与开发团队构建和共享模板的最佳方式。

  • 了解部署了什么基础设施非常重要。Spacelift 允许你通过资源视图来实现这一点。在这里,你可以查看在 Spacelift 内完成的所有工作。更重要的是,如果你实施漂移检测,它将在那里可见。

 关键点

Jenkins 是一个多功能且强大的工具,用于自动化 CI/CD 流程。本教程为您提供了理解和实施 Jenkins 流水线的全面基础。通过自动化构建、测试和部署任务,Jenkins 简化了软件开发生命周期,提高了效率和可靠性。