CI/CD最佳实践简介
介绍
持续集成、交付和部署,统称为 CI/CD,是现代开发不可或缺的一部分,旨在减少集成和部署期间的错误,同时提高项目速度。 CI/CD 是一种哲学和一组实践,通常通过强大的工具来增强,这些工具强调在软件管道的每个阶段进行自动化测试。 通过将这些想法融入您的实践中,您可以减少为发布集成更改所需的时间,并在将其投入生产之前彻底测试每个更改。
CI/CD 有许多潜在的好处,但成功的实施通常需要大量的考虑。 如果没有大量的反复试验,准确地决定如何使用这些工具以及您可能需要在流程中进行哪些更改可能具有挑战性。 然而,虽然所有的实现都会有所不同,但坚持最佳实践可以帮助您避免常见问题并更快地改进。
在本指南中,我们将介绍一些关于如何实施和维护 CI/CD 系统以最好地满足组织需求的基本指南。 我们将介绍一些有助于提高 CI/CD 服务效率的实践。 请随意阅读书面内容或跳至您感兴趣的领域。
保持您的管道快速
CI/CD 管道通过自动化测试周期帮助引导变更,到暂存环境,最后到生产。 您的测试管道越全面,您就越有信心更改不会在您的生产部署中引入不可预见的副作用。 但是,由于每次更改都必须经过此过程,因此保持管道快速且可靠非常重要。
这两个要求之间的紧张关系可能难以平衡。 您可以采取一些简单的步骤来提高速度,例如扩展 CI/CD 基础架构和优化测试。 但是,随着时间的推移,您可能会被迫对不同测试的相对价值以及它们运行的阶段或顺序做出关键决定。 有时,通过删除低价值或不确定结论的测试来缩减测试套件是保持大量使用的管道所需速度的最明智的方法。
在做出这些重大决定时,请确保您了解并记录您所做的权衡。 与团队成员和利益相关者协商,以调整团队对测试套件负责什么以及应该关注的主要领域的假设。
隔离和保护您的 CI/CD 环境
从操作安全的角度来看,您的 CI/CD 系统代表了一些需要保护的最关键的基础设施。 由于 CI/CD 系统可以完全访问您的代码库和在各种环境中部署的凭据,因此保护它至关重要。 由于其作为目标的高价值,尽可能隔离和锁定您的 CI/CD 非常重要。
CI/CD 系统应部署到内部受保护的网络,不暴露给外部各方。 建议设置 VPN 或其他网络访问控制技术,以确保只有经过身份验证的操作员才能访问您的系统。 根据网络拓扑的复杂性,您的 CI/CD 系统可能需要访问多个不同的网络才能将代码部署到不同的环境。 如果没有得到适当的保护或隔离,获得对一个环境的访问权限的攻击者可能能够 孤岛跳跃 ,这是一种通过利用更宽松的内部网络规则来扩展访问权限的技术,通过以下方式获得对其他环境的访问权限CI/CD 服务器的弱点。
所需的隔离和安全策略在很大程度上取决于您的网络拓扑、基础架构以及您的管理和开发要求。 要记住的重要一点是,您的 CI/CD 系统是非常有价值的目标,并且在许多情况下,它们可以广泛地访问您的其他重要系统。 屏蔽对服务器的所有外部访问并严格控制允许的内部访问类型将有助于降低 CI/CD 系统受到威胁的风险。
使 CI/CD 管道成为部署到生产的唯一途径
CI/CD 可以改进开发实践和代码质量的部分原因是工具通常有助于实施测试和部署的最佳实践。 通过 CI/CD 管道推广代码需要每次更改都证明它符合您组织的编纂标准和程序。 CI/CD 管道中的故障会立即可见,并会停止将受影响的版本推进到周期的后期阶段。 这是一种把关机制,可以保护更重要的环境免受不受信任的代码的影响。
但是,要实现这些优势,您需要确保对生产环境的每次更改都通过您的管道。 CI/CD 管道应该是代码进入生产环境的唯一机制。 这可以在使用持续部署实践成功测试结束时自动发生,或者通过手动提升 CI/CD 系统批准并提供的测试更改来自动发生。
通常,团队开始使用他们的管道进行部署,但在出现问题并且存在快速解决问题的压力时开始例外处理。 虽然应尽快缓解停机时间和其他问题,但重要的是要了解 CI/CD 系统是一个很好的工具,可确保您的更改不会引入其他错误或进一步破坏系统。 通过管道进行修复(或仅使用 CI/CD 系统回滚)也将防止下一次部署删除直接应用于生产的临时修补程序。 管道可以保护您的部署的有效性,无论这是常规的、计划的版本,还是解决持续问题的快速修复。 CI/CD 系统的这种使用是 保持管道快速 的另一个原因。
尽可能保持与生产的平价
CI/CD 管道通过一系列测试套件和部署环境促进变化。 通过一个阶段要求的更改要么自动部署,要么排队等待手动部署到更严格的环境中。 早期阶段旨在证明继续测试并将更改推向生产是值得的。
特别是对于后期阶段,在测试环境中尽可能接近地重现生产环境有助于确保测试准确反映变更在生产中的行为方式。 暂存和生产之间的显着差异可以允许发布有问题的更改,而这些更改在测试中从未被观察到错误。 您的实际环境和测试环境之间的差异越大,您的测试就越少衡量代码在发布时的执行情况。
分期和生产之间存在一些差异是意料之中的,但保持它们的可管理性并确保它们被充分理解是必不可少的。 一些组织使用 蓝绿部署 在两个几乎相同的环境之间交换生产流量,这些环境在指定的生产和登台之间交替。 不太极端的策略涉及将相同的配置和基础架构从生产环境部署到暂存环境,但规模要小一些。 网络端点之类的项目可能在您的环境之间有所不同,但这种类型的变量数据的参数化可以帮助确保代码是一致的并且环境差异是明确定义的。
仅构建一次并通过管道推广结果
CI/CD 管道的主要目标是建立对更改的信心并将意外影响的可能性降到最低。 我们讨论了在环境之间保持平等的重要性,但其中一个组成部分非常重要,值得特别关注。 如果您的软件需要构建、打包或捆绑步骤,则该步骤应仅执行一次,并且应在整个管道中重用生成的输出。
该指南有助于防止在多次编译或打包软件时出现问题,从而允许将轻微的不一致注入到生成的工件中。 在每个新阶段单独构建软件可能意味着早期环境中的测试并非针对稍后将部署的相同软件,从而使结果无效。
为避免此问题,CI 系统应包括构建过程,作为在干净环境中创建和打包软件的管道的第一步。 生成的工件应进行版本控制并上传到工件存储系统,以便在管道的后续阶段下拉,确保构建在系统中进行时不会发生变化。
尽早运行最快的测试
虽然保持整个管道快速是一个伟大的总体目标,但您的测试套件的某些部分将不可避免地比其他部分更快。 因为 CI/CD 系统充当所有更改进入系统的管道,所以尽早发现故障对于最大限度地减少用于有问题的构建的资源非常重要。 要实现这一点,首先要优先考虑并运行最快的测试。 保存复杂、长时间运行的测试,直到您使用更小、快速运行的测试验证了构建。
此策略有许多好处,可以帮助您保持 CI/CD 流程的健康。 它鼓励您了解单个测试的性能影响,允许您尽早完成大部分测试,并增加快速失败的可能性,这意味着可以在阻止其他成员的工作之前恢复或修复有问题的更改。
测试优先级通常意味着首先运行项目的单元测试,因为这些测试往往是快速的、独立的和以组件为中心的。 之后,集成测试通常代表下一个级别的复杂性和速度,然后是系统范围的测试,最后是验收测试,这通常需要某种程度的人工交互。
最小化版本控制系统中的分支
CI/CD 的主要原则之一是尽早且经常地将更改集成到主共享存储库中。 当多个开发人员试图将大型、不同和冲突的更改合并到存储库的主分支中以准备发布时,这有助于避免代价高昂的集成问题。 通常,CI/CD 系统设置为监视和测试仅提交给一个或几个分支的更改。
要利用 CI 提供的优势,最好限制存储库中分支的数量和范围。 大多数实现建议开发人员每天至少一次直接提交到主分支或合并来自本地分支的更改。
从本质上讲,您的 CI/CD 系统未跟踪的分支包含未经测试的代码,这些代码应该被视为对您的项目成功和发展的不利因素。 最小化分支以鼓励早期集成不同开发人员的代码有助于利用系统的优势,并防止开发人员否定它提供的优势。
在提交到 CI/CD 管道之前在本地运行测试
与早先关于早期发现故障的观点相关,应鼓励开发人员在提交到共享存储库之前在本地运行一些测试。 这使得在阻止其他团队成员之前检测某些有问题的更改成为可能。 虽然本地开发人员环境不太可能在类似生产的环境中运行整个测试套件,但这一额外步骤让个人更有信心,他们所做的更改通过了基本测试,值得尝试与更大的代码库集成。
为确保开发人员能够自行有效地进行测试,您的测试套件应该可以使用可以在任何环境中运行的单个命令来运行。 CI/CD 系统应该使用开发人员在其本地机器上使用的相同命令来启动对合并到存储库的代码的测试。 通常,这是通过提供一个 shell 脚本或 makefile 来以可重复、可预测的方式自动运行测试工具来协调的。
尽可能在临时环境中运行测试
为了帮助确保您的测试在不同阶段运行相同,尽可能使用干净、短暂的测试环境通常是一个好主意。 通常,这意味着在容器中运行测试以抽象主机系统之间的差异,并提供标准 API 以将各种规模的组件连接在一起。 由于容器以最小状态运行,因此测试套件的后续运行不会继承测试的残余副作用,这可能会污染结果。
容器化测试环境的另一个好处是测试基础设施的可移植性。 使用容器,开发人员可以更轻松地复制稍后将在管道中使用的配置,而无需手动设置和维护基础设施或牺牲环境保真度。 由于容器可以在需要时轻松启动然后销毁,因此用户在运行本地测试时可以在测试环境的准确性方面做出更少的妥协。 一般来说,在运行时环境的某些方面使用容器锁来帮助最小化管道阶段之间的差异。
结论
虽然每个 CI/CD 实现都会有所不同,但遵循其中一些基本原则将帮助您避免一些常见的陷阱并加强您的测试和开发实践。 与持续集成的大多数方面一样,过程、工具和习惯的混合将有助于使开发变更更加成功和有影响力。
要了解有关一般 CI/CD 实践以及如何设置各种 CI/CD 服务的更多信息,请查看其他带有 CI/CD 标签 的 文章。