持续集成和持续交付 - AWS 规范性指导

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

持续集成和持续交付

与使用传统软件开发和基础设施管理流程的组织相比,更快地演进和改进应用程序及服务

采用具有持续集成持续交付(CI/CD)的 DevOps 实践可促进构建、测试和部署应用程序的简化、自动化和高效流程。CI/CD 可实现软件的快速交付,降低部署错误的风险,并确保应用程序始终保持最新功能和错误修复。主要目标是通过从传统的软件开发和基础设施管理流程演变出来,以更快的速度发展和改进应用程序和服务。

启动

采用软件组件管理

软件组件管理是管理用于构建软件的所有个别组件的实践,包括库、框架、源代码存储库、模块、构件和第三方依赖关系。我们建议您使用版本控制系统(例如 Git 或 Apache Subversion)来管理源代码、启用协作和维护代码更改历史记录。您可以监控存储库中的更改和事件,以实现流程自动化、创建管线、管理代码,并根据需要将工作流程与其他服务集成。 

创建 CI/CD 管线

CI/CD 管线是由提交到版本控制系统的更改启动的一组自动指令。它们通常包括构建应用程序、运行自动测试以及将代码部署到特定环境的说明。您可以使用 AWS CodePipeline、Jenkins、GitLab 或 CircleCI 等工具设置自动的 CI/CD 管线。您也可以直接在支持管线生成的版本控制系统中进行设置。

从构建一个最小可行的持续集成管线开始,然后逐步演进到包含更多操作和阶段的持续交付管线。将您的持续交付配置视为代码。您可以为每个分支和团队使用多个不同的管线,因此请考虑需要设置哪些配置变量,以及如何最好地支持将要使用这些管线的团队。

考虑部署时段,即您要部署代码的日期和时间。考虑您的系统需求低谷时段,这样即使需要回滚,也能将对客户的影响降到最低。其他最佳实践包括避免在星期五进行部署,以及在高峰期或节假日之前实施代码冻结。考虑定义有关在提交作者不在场时(例如,在度假时)部署代码的规则。请记住,部署会失败,您可能需要依赖外部帮助。评估不同的部署方法,例如就地部署、滚动部署、不可变部署和蓝绿部署。考虑使用完全托管式服务来实现持续交付工作流程,以提高可用性和安全性,同时最大限度地减少复杂性和管理工作。

部署自动化测试

现代实践建议左移(将测试移到更靠近开发者和 IDE 的位置,并在生命周期的早期阶段进行),以在问题提交到存储库并启动管线之前检测和修复问题。此实践涉及与开发者进行快速反馈循环,因为开发者在编码时会检测到错误。左移成本较低,因为测试不需要运行流水线,这可能会导致异步反馈和更高的运营成本。

自动测试可在开发过程的早期发现错误,包括单元测试、集成测试及功能测试。我们建议您鼓励开发者尽早使用工具创建单元测试,并在将代码推送到中央存储库之前运行这些工具。此外,请确保您的自动化流程包括静态代码分析、性能基准测试和安全应用程序测试。

创建文档

除了实施 CI/CD 管线以简化开发工作流程外,您还应保留清晰而全面的文档,以确保管线的持续有效性、可维护性和可扩展性。文档是 CI/CD 管线的重要方面,因为它使开发团队能够清楚地了解管线的设计、组件和流程。创建文档时,首先要概述管线,解释架构和设计的权衡取舍,描述正在使用的工具和技术,指定初始配置和设置,概述安全措施和访问控制,及包括问题排查和维护信息。

使用基础设施即代码

使用 Terraform、Ansible 或 AWS CloudFormation 等工具来管理基础设施,确保环境的一致性和可重现性。将您的基础设施视为代码,确保跟踪基础设施中的更改,并避免直接在控制台中进行更改。将所有基础设施(包括数据库预调配)定义为代码,并使用管线部署这些更改。考虑在管线中将数据库集成作为代码运行,其中包含一小部分经过清理的生产数据。如果可能,进行更改并在代码中跟踪这些更改。

与软件代码一样,遵循以下基础设施代码的最佳实践:

  • 使用版本控制。

  • 利用错误跟踪和工单系统。

  • 让同行在应用更改之前对其进行审查。

  • 建立基础设施代码模式和设计。

  • 测试基础设施更改。

保留和跟踪标准指标

要保持高水平的绩效,请根据关键指标进行开发和跟踪,以了解管线的运行状况和业务影响,包括:

  • 构建频率。构建的数量可以让您深入了解团队的工作效率和更改的复杂性。

  • 部署频率。定期部署表明开发过程运行状况良好、敏捷。

  • 变更前置时间。衡量更改投入生产所需的平均时间可以帮助您确定部署过程中的瓶颈。

  • 通过管线的平均时间。从初始管线阶段到每个后续阶段的平均时间可以帮助您优化工作流程。

  • 生产更改量。跟踪投入生产的更改数量可以深入了解生产环境的稳定性。

  • 构建时间。平均构建时间可以表明代码库或基础设施中存在潜在问题。

推进

使用配置管理

配置管理工具在自动化软件和基础设施的部署、配置和管理方面起着至关重要的作用。它们提供了一种系统性方法来处理更改,并维护各种环境中基础设施、软件和配置的预期状态。这些工具使开发者能够使用声明式或命令式语言来定义所需的系统状态。然后,配置管理工具会自动将这些配置应用于目标系统,从而确保一致性和可重复性。

使用配置管理工具自动部署、配置和管理软件和基础设施。AWS Systems Manager状态管理器是一项安全且可扩展的配置管理服务,可自动将您的托管式节点和其他 AWS 资源保持在定义的状态。

集成监控和日志记录

将监控和日志记录解决方案集成到 CD 管线中,可以为开发团队和整个软件开发过程带来诸多好处。这些解决方案可以提供对应用程序性能的实时洞察,能够更快地识别和解决问题,并促进持续改进,以帮助确保应用程序在整个生命周期中保持可靠、高性能和可扩展性。投资监控和日志记录解决方案是维护稳健而高效的 CD 管线的关键方面,它最终有助于成功交付高质量的软件。

创建合并节奏

每天至少一次将代码更改提交或合并到主线(干线或主线)分支;理想情况下,每次任务完成后提交或合并,一天可多次操作。此节奏会导致每天多次调用管线。基于拉取的分支工作流程模型与此方法一致。使用功能标志暗启动和类似技术来自定义客户使用的功能。 

捕获部署后的行为

部署后,使用自动综合测试捕获生产行为,并将结果与持续交付管线同步,以确保及时采取纠正措施。开发者的首要任务应该是尽快修复管线中发现的错误,将代码更改提交到源代码存储库,并在管线中验证错误是否已解决。

最佳部署后实践包括观察最重要的关键绩效指标(KPI),并验证生产环境中没有错误。自动处理错误并评估部署后 KPI,以量化发布的影响。自动生成速度、安全性和稳定性指标,供开发者进行改进。有关更多信息,请参阅 AWS 上的解决方案 DevOps 监控控制面板

Excel

采用尖端实践和技术以实现最佳性能。不断完善 CI/CD 流程可帮助您提高软件质量、缩短上市时间并提高敏捷性。新的技术和工具不断涌现,这使得您的组织必须随时了解情况,并进行调整以保持竞争优势。

要保持适应性,请考虑以下事项:

  • 将所有内容定义为代码,包括您的应用程序、配置、基础设施、数据、AWS 账户和组织、部署管线、网络以及安全性和合规性控制。

  • 为计算映像、共享服务和应用程序创建相应的部署管线

  • 考虑一个 GitOps 模型,在该模型中,基于拉取的请求通过将现有基础设施状态与所需状态进行比较来启动工作流程来部署更改,如代码中所述。

  • 考虑使用 CD 管线来部署机器学习(ML)、数据、物联网(IoT)及其他工作负载。

  • 对所有构建构件进行数字签名,并将其存储在安全的存储库中。

  • 通过自动生成软件物料清单来跟踪软件来源,该清单记录部署给客户的所有版本和数字签名的构件。

  • 在软件交付过程中消除所有手动活动后,删除手动审查委员会。

对于已实现整个软件交付流程自动化的应用程序和服务,请考虑持续部署,在此部署中,团队会将通过管线中所有检查的更改部署到生产中的客户。有关可视化,请参阅 AWS 网站上的 What is Continuous Delivery?

集成的人工智能/机器学习技术

将人工智能(AI)和机器学习(ML)技术集成到 CI/CD 管线中可带来多项好处,包括:

  • 自动测试生成

  • 智能测试优先级

  • 用于问题检测的预测性分析

  • 异常检测和根本原因分析

  • 代码审查和质量保证

  • 部署优化

有关更多信息,请参阅 AWS 网站上的将智能添加到开发人员操作中

采用混沌工程实践

混沌工程包括故意向系统注入故障,以测试其承受意外事件并从中恢复的能力。通过识别弱点并主动加以解决,组织可以提高其整体系统可靠性并最大限度地减少潜在问题的影响。

采用混沌工程实践,以使用 Gremlin、Chaos Monkey 或 Litmus 等工具来测试系统的韧性。定期运行受控实验,以识别漏洞,验证容错能力,并确保您的应用程序可以优雅地处理意外故障。此积极主动的方法有助于提高系统的可靠性,并有助于建立更稳健的 CI/CD 管线。

优化性能

通过使用剖析工具、实时监控和反馈循环,来持续优化应用程序的性能。应用以下技术来确保您的应用程序可以处理增加的流量和需求:

  • 代码优化

  • 分析

  • 实时监控

  • 反馈循环

  • 缓存

  • 负载均衡

  • 可扩展性和性能测试

实施高级可观测性

提升云基础设施的可观测性不仅仅是收集、汇总和分析指标、日志及跟踪数据这些基本要素。当使用 Amazon CloudWatch 和 AWS X-Ray 等工具增强可观测性时,它就会演变为一种推动持续交付和创新的战略实践。

在稳健的 CI/CD 管线中,高级可观测性使您能够发现洞察,不仅可以了解您的应用程序和基础设施,还可以深入了解整个系统的性能和运行状况,包括管线本身。这些洞察可帮助您:

  • 快速识别、了解和解决潜在问题,以提高应用程序稳定性并减少停机时间

  • 简化 CI/CD 流程,实现更快、更可靠的交付

  • 更深入地了解代码更改和部署的影响,以推动明智的决策

  • 优化资源利用,以提高运营效率和成本效益

要提高可观测性,请执行以下操作:

  • 将可观测性嵌入应用程序和基础设施的每一层,从而全面了解系统的性能、行为和运行状况。

  • 使用 Amazon CloudWatch 等工具集中收集、存储和分析数据,统一您的可观测性数据,便于访问和解释。

  • 使用 AWS X-Ray 进行分布式跟踪,以了解您的应用程序及其基础服务的性能。

  • 建立反馈循环以实现持续改进,并使用您的可观测性数据来推动系统的迭代增强。

采用高级可观测性不仅仅是为了维护您的系统,更是一项战略举措,旨在实现卓越运营,并推动组织内的持续创新。

实施 GitOps 实践

通过使用 Git 存储库作为单一事实来源,实施 GitOps 实践来管理基础设施和应用程序配置。此方法简化了更改管理,增强了可追溯性,并确保了跨环境的一致性。