Jenkins 旨在简化软件交付流程。它是一个适用于各种软件工程任务的多功能平台,主要用于管理 CI/CD 管道,以确保更改得到有效验证和部署。
在本文中,我们将探讨 Jenkins 在现代软件开发中的关键特性、优势和实际应用及其在 DevOps 实践中的作用。
我们将介绍的内容:
- 什么是 Jenkins?
- Jenkins 如何工作?
- Jenkins 核心概念和功能
- 使用 Jenkins 有什么好处?
- Jenkins有什么缺点?
什么是 Jenkins?
Jenkins 是一个开源自动化平台,用于实现持续集成和持续交付 (CI/CD) 流程。它通过执行由不同类型环境中的新提交、分支和拉取请求等事件触发的作业来自动执行构建、测试和部署任务。其高度可扩展的插件架构可与众多工具和技术无缝集成。作为基于 Java 的应用程序,Jenkins 与多种操作系统兼容,包括 Windows、Linux 和 macOS。
Jenkins 用于什么?
Jenkins 用于构建、测试和部署软件项目以及自动化CI/CD 管道。它协调跨多个开发阶段的复杂工作流程,并与软件开发生命周期中的各种工具和技术集成。Jenkins 还可以监视和报告构建和部署过程。
Jenkins 是 CI 还是 CD 工具?
Jenkins 主要是一个用于持续集成 (CI) 的工具,但也可以用于持续交付 (CD)。
CI 鼓励开发团队将正在开发的源代码集成到版本控制系统中,以便负责构建和运行测试用例的自动化管道能够快速向开发人员提供反馈。CI 的重点是尽快提供这种反馈,以便开发人员在部署到生产/更高环境之前修复错误并积极降低风险。
CD 是一种使用自动化管道来管理软件发布的实践。它涉及使用工具来促进部署工件依赖项的创建,并以可重复和可靠的方式设置特定于环境的变量。持续交付与持续部署的不同之处在于,它需要在将新的软件版本部署到生产环境之前进行手动批准。
Jenkins如何工作?
Jenkins 与 Git 存储库集成,开发人员可以在其中协作并提交代码更改。Jenkins 会获取这些更改以自动启动构建过程,该过程涉及编译、测试和错误报告,作为对开发人员的反馈循环。这可以在不影响生产的情况下缩短开发生命周期的周转时间。
作为持续交付的一部分,您还可以使用各种自动化任务来管理依赖项并将部署工件推送到适当的存储库。工件的示例包括 Java 程序所需的 jar 文件和基于容器的部署的容器映像。
由于该工具是开源且可扩展的,它使 Jenkins 社区能够开发出强大的插件生态系统。许多插件可用于与版本控制、源代码管理、构建、测试框架、部署目标、报告等相关的特定任务。这种模块化方法还允许组织创建灵活且高度定制的管道。
Jenkins 核心概念和功能
掌握某些概念对于全面理解 Jenkins 至关重要。以下列表将帮助您快速构建基本管道,我们将在以下部分中介绍这些概念。
注意: 这不是一个详尽的功能列表。
1. Jenkins管道
Jenkins 管道代表使用多种工具为 CI/CD 构建的端到端工作流。它定义了在各种环境中自动构建、测试和交付/部署应用程序所需的步骤。
管道使用YAML 文件定义,在 Jenkins 上下文中,此文件名为“Jenkinsfile”。创建 CI/CD 管道可确保标准化、实施最佳实践、促进轻松协作并加快新应用程序功能的交付。
下图展示了 Jenkinks 管道示例:
2. 在 Jenkins 中构建
Jenkins 中的构建是指将应用程序源代码编译、测试并打包成可部署工件的阶段。构建可以手动或自动触发,其中 Jenkins 自动化服务器会轮询源代码存储库中的更改。构建涉及各种子任务,例如编译代码、运行单元测试、静态代码分析、文档生成等。
根据开发软件的编程语言,可以使用各种插件来支持 Jenkins 中的构建过程。此外,根据部署类型,各种类型的工件都会被版本化、创建并保存在预定义位置。
3. Jenkins 触发器
顾名思义,触发器是启动构建或部署管道的操作或事件。Jenkins 支持各种类型的触发器。示例如下:
- SCM 触发器:Jenkins 轮询 SCM 存储库的更改。当发现更改时,Jenkins 开始执行管道作业并处理最新的源代码。
- 参数化触发器:此触发器可以根据用户定义的输入触发构建。
- 手动触发:您可能需要通过登录 Jenkins 环境来明确触发管道。
- 基于时间的触发器: 管道可以根据特定的时间表运行。设置 cron 作业以在每个设定的间隔后启动管道执行。
- Webhooks: 当管道根据外部平台上发生的某些事件运行时,我们可以使用 webhooks 在 Jenkins 中触发管道执行。
4. Jenkins 工件
工件是构建过程中产生的文件,用于部署或报告目的。各种运行时环境需要各种类型的可执行文件和二进制文件,这些文件和二进制文件通常来自编译和构建过程。
Jenkins 提供工件管理功能,允许用户在 Jenkins 服务器本地或外部平台上发布或存档。这提高了软件开发过程中的可追溯性、可重复性和可靠性。
5. Jenkins代理
代理是 Jenkins 用于执行流水线作业的基础设施组件。流水线运行需要计算资源来运行执行步骤中指定的脚本和命令。除了在 Jenkins 服务器上本地执行外,还可以在其他本地服务器、虚拟机或容器化环境中运行构建作业。
事实上,强烈建议不要在安装 Jenkins 的服务器上执行构建作业。这些资源/VM 称为代理。代理有助于将 Jenkins 操作扩展到单个团队之外,以满足项目/组织级别的自动化和构建要求。
6. Jenkins 管道阶段
阶段提供了一种逻辑结构,用于组织和可视化 Jenkins 中的管道工作流。这允许开发人员将复杂的 Jenkins 管道划分为清晰的阶段,这有助于调试或解决问题。阶段代表管道的一个阶段。
例如,我们可以有构建、测试和部署阶段。每个阶段都进一步包含完成阶段预期任务的作业。一般来说,Jenkins 中的阶段为管道提供了逻辑结构。
阶段显示在“阶段视图”中:
7. Jenkins 作业(项目)
作业表示管道按特定顺序执行的一组预定义操作。例如,构建过程涉及多个作业(构建、测试、推送等),它们是 Jenkins 管道的构建块。我们可以配置作业来运行各种脚本和命令。在 Jenkins 中,作业接受各种参数输入,您可以使用它们定义复杂的工作流。
8. Jenkins 管道中的步骤
步骤是 Jenkins 管道中最小的工作单元。脚本中编写的每个命令或行都是一个步骤。Jenkins 支持各种内置和插件提供的步骤,以及使用 Groovy 语言编写自定义步骤的能力。
为了更全面地了解阶段、作业和步骤,Jenkins 管道有多个由阶段定义的阶段。每个阶段包含多个作业,每个作业由使用脚本语言编写的多个步骤定义。
9. Jenkins 插件
典型的 Jenkins 安装包含核心平台。插件扩展了其功能,为各种用例提供了附加功能和集成。
Jenkins 插件提供了涵盖流水线和平台管理所有阶段的广泛功能。各种第三方系统可以通过插件与 Jenkins 集成。还可以开发自定义系统。插件利用可重用性,从而提高开发团队的生产力和效率。
10. Jenkins文件
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 的内部工作原理。
JENKINS_HOME
在安装 Jenkins 的服务器上,插件和管道、构建工件、运行时数据等的管理和配置所需的所有文件都存储在名为“JENKINS_HOME”的特定目录中。根据操作系统的不同,此目录的确切路径可能会有所不同。存储在此目录中的配置文件可确保服务器重启后的持久性。这也有助于灾难恢复并创建备份。
业务层
该层负责管理核心活动,如作业和用户管理、构建执行和插件集成。业务层处理这些组件与来自外部系统的传入请求之间的交互。
触发管道执行的每个传入请求都会经过权限验证,将操作委托给代理机器,向适当的系统提供状态更新,并处理通知。Jenkins 架构图中显示的业务层是完成基础工作并抽象出复杂性的中央系统。
Stapler 网络框架
在上图中,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 通过提供一个用于监控和管理构建、测试和部署的集中平台,实现了开发团队之间的协作。其 Web 界面提供了实时构建状态、测试报告和项目进度的视图。这是透明度和可见性的关键,有助于改善沟通并加快问题解决速度。 |
| 经济高效且开源 | Jenkins 提供了一种开源工具来替代专有工具,使各种规模的组织都可以使用它。积极的社区支持确保平台的持续改进,从而以经济高效的方式利用自动化功能,否则从供应商锁定和维护的角度来看成本会很高。 |
Jenkins有什么缺点?
使用 Jenkins 的主要挑战包括性能和可扩展性问题、复杂的配置和维护以及插件管理困难。Jenkins 还可能占用大量资源,导致构建速度缓慢,如果配置不当,还可能存在安全漏洞。
以下是 Jenkins 最大的限制:
| 复杂设置 | 虽然 Jenkins 是一款开源软件,有助于提高成本效益,但它的缺点是设置和维护操作。它是最古老的自动化平台之一,需要花费大量时间和精力来设置和管理。回滚和自动备份并不像同行那样简单,因此需要格外小心。至少可以说,Jenkins 的设置相当复杂。 |
|---|---|
| 插件生态系统 | 正如开源既是优点也是缺点一样,插件生态系统既是优点也是缺点。一方面,利用第三方插件可以节省时间,但另一方面,您需要确保插件是最新的。较新的版本也可能会引入重大更改或不兼容问题。 |
| 安全漏洞 | Jenkins 的核心平台曾出现过严重漏洞,这些漏洞可能会导致远程代码执行、任意文件读取访问、XSS 等。这些安全漏洞要求管理员保持 Jenkins 服务器为最新版本,这又增加了设置和操作的复杂性。 |
| 过时的用户界面/用户体验 | Jenkins UI 几乎没有升级,用户体验不符合当今的标准。它提供基本的导航功能,但不够直观或现代。 |
接下来会继续介绍如何使用 Jenkins,敬请期待。