持续交付是什么:CI/CD实践指南

持续交付是指团队能够快速、安全、可持续地按需发布各类变更。对于希望提升 CI/CD 能力、优化软件交付流程、降低发布风险的团队来说,持续交付不是简单地“更频繁发布”,而是让软件始终保持可部署状态。实践持续交付的团队,可以随时以低风险方式发布软件,并对生产环境进行变更,包括在正常工作时间内完成发布,而不会影响用户。

持续交付是什么:CI/CD实践指南

持续交付的原则和实践适用于各种软件场景,包括:

  • 在复杂分布式系统中更新服务;
  • 升级大型机软件;
  • 修改基础设施配置;
  • 变更数据库架构;
  • 自动更新固件;
  • 发布移动应用的新版本。

当团队真正实践持续交付时,应该能够对以下问题回答“是”:

我们的软件在整个生命周期内,是否始终处于可部署状态?

相比开发新功能,我们是否会优先保证软件的可部署性?

团队中的每个人,是否都能快速获得关于系统质量和可部署性的反馈?

当我们收到系统无法部署的反馈,例如构建失败或测试失败时,是否会把解决这些问题作为首要任务?

我们是否能够随时按需将系统部署到生产环境,或交付给最终用户?

持续交付与持续部署的区别

持续交付经常与持续部署混淆,但二者是不同的实践。持续部署是指团队尽可能快地将每一次代码变更部署到生产环境。持续部署适用于 Web 服务,但并不适用于固件、移动应用等所有软件类型。持续交付则适用于所有类型的软件,包括固件、大型机系统以及高度监管的环境。即使团队从未打算采用持续部署,也可以,而且应该,从持续交付开始。

持续交付和持续部署常常被误认为风险较高,不适用于受监管或安全要求极高的领域。事实上,持续交付的目标恰恰是降低软件风险。DORA 的研究也持续表明,高绩效团队通常能够实现更高的可靠性和可用性。推动持续交付的技术实践,例如持续测试、安全左移、全面测试和可观测性,在高度监管和安全关键领域尤其重要。持续交付已经在金融服务、政府等高度监管领域多次成功落地。

持续交付能带来哪些价值

尽管持续交付适用于各种软件类型,但它并不容易实现。不过,它能带来显著收益。DORA 的研究表明,做好持续交付可以带来以下好处:

  • 提升软件交付绩效和可用性,这可以通过四个关键指标进行衡量;
  • 提升质量水平,具体可以通过团队花在返工或计划外工作上的时间占比来衡量;
  • 降低职业倦怠水平,提升工作满意度,并改善组织文化;
  • 减少部署痛苦,也就是降低部署过程中的破坏性、压力感,以及工程师和技术人员在将代码推送到生产环境时感受到的恐惧和焦虑;
  • 影响企业文化,提升心理安全感,并形成更具使命感的组织文化。
持续交付是什么:CI/CD实践指南

持续交付只是实现上述成果的关键组成部分之一,虽然它非常重要。DORA 研究中提到的其他文化能力和组织能力,也会共同影响这些结果。团队可以通过实施本文所描述的技术实践,逐步实现持续交付。

如何实施持续交付

DORA 的研究发现,以下技术能力是实现持续交付的关键驱动因素。组织内部的变革型领导力,也会推动这些技术能力的落地。

为了帮助团队实现更高吞吐量和更低风险的发布,可以重点实施以下持续交付实践。

测试自动化。 指使用一套综合性的自动化测试套件,这些测试主要由开发人员创建和维护。有效的测试套件应该是可靠的,也就是说,测试能够发现真实故障,并且只有可发布代码才能通过测试。

部署自动化。 指部署流程在多大程度上实现了完全自动化,并且不需要人工干预。

基于主干的开发。 其特征包括:代码库中的活跃分支少于三个;分支和 fork 分支的生命周期非常短,例如不超过一天,随后就会合并回主线;应用团队很少或几乎没有代码锁定期,也就是不会因为合并冲突、代码冻结或稳定阶段而禁止提交代码或发起拉取请求。

安全左移。 指将安全融入软件开发过程的设计和测试阶段。具体做法包括:对应用进行安全评审;让信息安全团队参与应用设计和演示过程;使用预先批准的安全库和软件包;并将安全功能纳入自动化测试套件。

松耦合团队。 指一种组织结构,使团队能够按需测试和部署应用,而不需要与其他服务或团队进行复杂协调。团队结构和技术架构高度相关:松耦合架构能够让团队独立工作,减少对其他团队支持和服务的依赖,从而提升效率,并为组织创造价值。DORA 研究显示,松耦合架构是持续交付成功的重要预测因素之一:达到可靠性目标的高绩效团队,采用这类架构的可能性明显高于低绩效团队。

赋予团队选择工具的权力。 能够自主选择工具的团队,在持续交付方面往往表现更好。没有人比一线实践者更清楚自己需要哪些工具才能高效完成工作。

持续集成。 持续集成是一种开发实践,要求团队定期提交代码,每次提交都会触发一组快速测试,以发现回归问题,开发人员也会立即修复这些问题。CI 流程会生成标准化构建产物和软件包,供后续部署和发布使用。

持续测试。 指测试贯穿整个软件交付生命周期,而不是在开发完成后才进入一个独立测试阶段。通过持续测试,开发人员和测试人员可以并肩工作。优秀开发人员通常会实践测试驱动开发,在十分钟内获得测试反馈,并持续审查和改进测试套件,例如提升缺陷发现能力并控制测试复杂度。

版本控制。 指使用版本控制系统管理所有生产工件,包括应用代码、应用配置、系统配置,以及用于自动化构建和环境配置的脚本。

测试数据管理。 有效的测试数据管理实践包括:拥有足够的测试数据来运行测试套件;能够按需获取所需数据;数据量不会限制测试运行数量。我们建议团队尽可能减少运行自动化测试所需的测试数据量。

全面监控和可观测性。 指让团队能够理解系统运行状况。有效的监控与可观测性方案,可以帮助团队监控预先定义的指标,包括用户实际体验到的系统状态;同时,也允许工程师以交互方式调试系统,探索系统属性和运行中涌现出的模式。

主动通知。 指持续监控系统运行状况,使团队能够提前发现并缓解问题。

数据库变更管理。 如果团队遵循一些关键实践,数据库变更就不会拖慢交付速度。这些实践包括:将数据库变更以脚本形式存储在版本控制中,并以与生产应用变更相同的方式管理这些变更;让软件交付生命周期中的每个角色,包括工程师,都能看到数据库变更;当应用变更需要数据库变更时,及时与所有相关方沟通。

代码可维护性。 指通过系统和工具,使开发人员能够轻松修改他人维护的代码,在代码库中找到示例,复用他人的代码,并在添加、升级或迁移依赖项时避免破坏已有代码。

虽然持续交付通常与持续集成一起出现,被统称为 CI/CD,但研究表明,持续集成只是实现持续交付的一个要素。要实现可靠、低风险的发布,需要软件交付流程中所有参与者紧密协作,而不仅仅是软件开发人员参与。同时,团队也需要采用新的工作方式,并学习新的技能。

在实际落地时,持续交付还需要把目标、需求、开发、测试、发布、监控和复盘连接成一条可追踪的研发链路。借助 PingCode 这类研发管理工具,团队可以将需求清理、评审排期、开发任务、测试验证、发布上线和 Wiki 知识沉淀串联起来,并与代码仓库、CI/CD 等研发工具打通,让持续交付不只是流水线自动化,而是贯穿整个软件交付生命周期的协作机制。

实施持续交付的常见陷阱

有些组织误以为,只要更频繁地执行现有部署流程,就能实现持续交付。然而,真正实现持续交付所需的技术能力,通常需要团队对流程和架构进行重大调整。如果流程和架构没有改进,仅仅提高部署频率,很可能会导致更高的失败率,并让团队筋疲力尽。

许多关于持续交付的讨论都集中在工具和模式上,例如如何通过部署流水线,将变更从版本控制系统部署到生产环境。然而,如果没有落实本文中提到的必要技术实践和流程变更,仅仅引入现代工具,并不能产生预期效果。

DORA 研究发现,转型项目中常常会出现典型的 J 型曲线。为了走出 J 型曲线底部,团队需要同时考虑流程重设计与简化、架构改进、能力和技能发展,以及自动化和工具化建设。

持续交付是什么:CI/CD实践指南

典型的 J 型曲线通常包含以下阶段:

在转型初期,团队开始转型,并寻找能够快速见效的方法。

在初步改进阶段,自动化可以帮助低绩效团队提升到中等绩效水平。

在效率下降阶段,也就是 J 型曲线底部,自动化会增加测试需求,而这些测试仍然需要人工处理;大量技术债务也会阻碍进展。

随着团队逐渐走出困境,技术债务和不断增长的系统复杂性,会导致变更过程中出现额外的手动控制和多层流程,从而拖慢工作速度。

在达到高绩效阶段后,持续不断的改进工作才能真正带来卓越表现。优秀团队能够充分利用自身专业知识,并从周围环境中持续学习,从而提升生产力。

缓解 J 型曲线影响的一种有效方式,是开展价值流图分析,以发现并预测瓶颈的影响。在价值流图分析中,团队需要观察单个变更从版本控制进入生产环境的完整过程:

  • 考虑每次变更必须经历的各种流程,例如自动化测试、手动测试、安全审查、变更管理以及发布到生产环境;
  • 测量变更从进入版本控制到发布所需的总时间;
  • 针对每个流程,测量实际耗时和增值时间。实际耗时是端到端流程所消耗的时间,增值时间则是真正完成有价值工作的时间;
  • 记录工作因为第一次没有正确完成而被退回的比例。这个指标通常被称为完成准确率,也就是 %C/A。

价值流图的目的,是帮助团队发现流程中的低效环节。团队需要共同绘制一张价值流图,描述六个月后理想的价值流状态,并预留资源去实现这一目标。随后,团队应找出并消除那些流程耗时过长,尤其是相对于价值创造时间过长,或者完成准确率较低的障碍。

通常,在实施部署流水线时,需要对流程和架构进行重大重设计。由于部署流水线覆盖从代码提交到发布的完整过程,并连接多个团队,因此所有相关团队的代表都必须参与价值流图绘制,并就通用工具链和流程达成共识。例如,团队需要共同确定部署到测试环境和生产环境的流程,这些都应成为未来目标状态的一部分。

持续交付的实施,是一个持续的、日常的改进过程,其指导原则是实现预期结果。工具和模式固然重要,但它们只能服务于这项关键的改进工作。

如何衡量持续交付效果

持续交付的最终目标,是确保团队能够在正常工作时间内,以低风险方式执行发布。理想情况下,不应该要求任何人在正常工作时间之外完成部署或发布。因此,对这一点进行衡量非常重要。

持续交付的成效最终体现在成果上。你可以通过 DORA 快速评估,查看团队在关键持续交付指标上的表现:

  • 常规变更和紧急变更的前置时间都很短,理想状态是能够使用常规流程处理紧急变更;
  • 变更失败率较低;
  • 发生故障或服务降级时,可以在较短时间内恢复服务;
  • 发布频率能够确保高优先级功能和错误修复及时交付。

正如本文开头所讨论的,实施持续交付还应该降低返工率,减少部署痛苦,并减少团队花在返工和计划外工作上的时间。

归根结底,持续交付不是简单地“更频繁发布”,也不是只搭建一条 CI/CD 流水线。它要求团队持续保持软件可部署状态,通过自动化测试、部署自动化、主干开发、安全左移、可观测性和低耦合架构降低交付风险。只有当这些技术实践与团队协作方式、组织能力建设和持续改进机制结合起来,持续交付才能真正提升软件交付绩效和组织可靠性。

文章包含AI辅助创作,作者:guo,如若转载,请注明出处:https://docs.pingcode.com/baike/5247539

(0)
guoguo
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部