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系统部署到内部,受保护的网络,未暴露于外部各方。 建议设置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标签的文章