在传统的软件开发方法中,每一个小的功能更新或Bug修复都会每隔一段时间分开发布,这极大地增加了变更在部署时被耦合的几率。随着时间推移,问题开始增多,给整个团队带来了更多的挑战。最糟糕的是,所有的流程都是手动的,而且这些产品大多是单独开发/测试的。很显然,它将变得更容易出现人为错误。

往往变更是主要引发系统故障的主要因素之一,故变更的可见性变得尤其重要,常见的变更包括服务变更、配置变更、数据变更;变更可见性是通过各种手段对变更的内容、行为、时间进行多维进行管理和监控,便于后续的审计和分析。

变更是引发系统故障的主要因素,那么究其本质的原因一方面是对变更的内容、影响、范围没有合理的评估;另外一方面是变更的流程,不够标准化。

针对原因一,可参考如下:

  • 首先对变更的内容正确性确认,要有组内成员进行确认
  • 变更内容的影响范围进行合理评估、如该变更是否影响上下游服务、对资源(流量、CPU、连接数)使用情况是否增加、对数据是否有影响
  • 该变更是否需要通知兄弟部门(对兄弟部门是否有影响)
  • 该变更时间点、操作人、操作前 checklist
  • 该变更可能带来哪些问题、哪些问题是符合预期、一旦出现非预期,预案是什么,回滚还是怎么着。
  • 变更内容版本覆盖率、集成测试覆盖率

针对原因二,可参考如下:

  • 变更操作形式、人工还是自动
  • 变更是否可灰度
  • 变更前后是否可监控
  • 变更是否可回滚

对于线上变更,首先要敬畏线上,谨慎变更,这方面更多通过机制和工具来帮助我们校验和减少出错的概率,最好的是能够将这套变更流程标准化,自动化,将变更的每一个操作进行可见并可视化,减少人工参与,业界比较流行的持续集成/持续部署(CI/CD) 。 CI/CD就是解决这一切的东西,使整个流程更加可控和高效。 具体而言,CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期(从集成和测试阶段,到交付和部署)。

持续集成/持续部署(以下称为CI/CD)是现代软件开发实践中构建、测试和部署应用到生产环境的支柱。CI/CD在弥合开发与各受影响团队之间的差距方面发挥着举足轻重的作用。CI有助于降低风险,通过自动处理项目不同开发人员的代码变更实现生产均等化。另一方面,CD使开发人员能够无缝地将集成代码交付给生产,从而提供快速有效的自动化流程,以便在不费工夫的情况下向客户发布新功能和更新。

持续集成的两个主要原则是,频繁运行代码以及自动执行软件交付生命周期的构建和测试部分。每天多次运行代码集成意味着可以更快地发现错误,然后可以更快地纠正错误,因为每次要做的事很少。

CICI优势

CI/CD已成为现代软件开发周期中不可或缺的一部分,在项目中使用的CICD优势如下:

提升代码质量

CI/CD的主要技术优势之一是它能提高整体代码质量。CI/CD流水线使开发人员能够以小批量的方式将他们的代码集成到一个通用的存储库中。通过这个存储库,开发人员可以与整个团队共享他们的构建,而不是孤立地工作。现在整个团队可以合作,彻底检测和修复最严重的错误。此外,这有助于更频繁地共享稳定的构建,消灭任何关键性bug,尽量杜绝错误代码进入生产环境。这就是CI/CD实施如何简单地减少错误代码进入生产的几率。

加速发布周期

由于检测和纠正生产所需的时间更短,因此发布时间更短;CI/CD可以加快发布速度。任何软件开发系统只有在持续的自动测试管道[1]中开发代码,才能支持重复发布。CI/CD通过不断合并代码并定期将其部署到类似生产的系统中以保持代码处于发布状态来达到这一目的。这也使企业能够建立一个标准化的交付机制,为每一个变更运行重复的流程,任何人都能完全信任这个流程。

故障检测和隔离

检测故障的根源并指出故障的确切位置是CI/CD最被宣扬的优点之一。故障隔离是指在系统设计中,通过精确指出故障的原因所在,限制错误带来的负面结果。这类措施降低了未解决或者未检测到的问题的影响,使系统更容易维护。这也是使用CI/CD管道的最主要原因之一,因为它使故障隔离在影响整个系统之前变得更简单、更快速。

增强测试可靠性

使用CI/CD,可以在很大程度上提高测试可靠性。由于向系统中引入了特定的、原子性的变化,它允许开发人员或QA为变更添加更多相关的正向和反向测试。这种测试也被称为CI/CD流水线中的“持续可靠性”。

它也使代码更加可靠,因为它防止了经常由诸如它在我的本地系统上是正常的这种情况引起的问题,因为在本地运行的测试只是在本地机器上的代码快照上执行。持续集成通过在集成的代码上进行持续测试来防止这种情况。

减少任务堆积

通过在你的开发流程中实施CI/CD,你有机会减少团队中积压的非关键缺陷数量。这些缺陷通常在成为关键问题之前被解决。任何这类缺陷都会被突出显示,并在其进入生产和影响到最终用户前被修复。

降低成本

CI/CD管道允许在非关键业务时间部署,从而限制了部署问题可能造成的潜在影响和损失。此外,在开发阶段重复的自动化部署可以帮助开发人员在造成任何重大损害之前及早捕获错误。这样的管道实现提高了代码质量,从而提高了企业的整体投资回报率。

改善平均解决时间

MTTR是对任何或所有可修复特性的可靠性和可维护性的度量。它给出了一个关于从可能的故障中恢复所花费的平均时间的时间表。CI/CD的主要优点之一就是它能帮助你把这个数字降下来。较小的代码更改和更快的故障隔离在将故障控制在最低限度方面发挥了重要作用。它还有助于在短时间内从任何倒退中恢复过来,因为CI/CD确保修复在部署到生产环境之前与整个代码集成快速测试。

CICD挑战

在CI/CD管道中实施过程中面临的挑战,同样也需要我们能够清楚的了解并掌控这些挑战,如下:

有限的环境

在CI / CD管道实施期间,有限数量的共享测试环境会增加出现瓶颈的风险。您将需要保留一个环境,以避免并排运行的多个CI / CD管道尝试在同一环境中进行部署和测试。部署失败的主要原因之一是先前团队或测试运行所修改的配置错误的环境。

安全性和所有权

有时,当交付管道跨越组织中的多个团队时,当阶段失败时,很难知道谁需要修复管道。在CI / CD管道的每个阶段都必须指派一位所有者,负责解决问题并确保交付顺利进行。所有者还将为反馈驱动的管道改进做出贡献。 团队使用的编排工具应具有有效的安全模型,以更好地了解整个CI / CD管道的状态。例如,要确定测试失败的原因,团队将必须检查测试阶段的结果。但是,不应授予他们修改或禁用该测试步骤的配置的权限。

管理多个自定义CI / CD管道

大型组织中将有多个CI / CD管道,因为它们具有跨越不同部门,技术平台和客户的多样化产品组合。如果每个管道在交付过程的不同阶段结束,将很难分析诸如吞吐量,成功执行和周期时间之类的指标。如果每个CI / CD管道均基于标准模板,则管理起来比较容易。这将有助于有意义的比较报告,并将提供有用的反馈以改进其他渠道。

大量应用

具有多个需要编译,测试和部署的组件的大型应用程序很难进行增量更新,从而导致较长的测试和部署周期。由于多个团队同时进行多项更改,因此执行质量控制和根本原因分析变得更加困难。由于发布过程需要稍有不同,因此很难创建标准化的交付管道。团队通常会启动工作流,以逐步将应用程序的组件分解为不同的模块,以便可以分别构建和部署它们,从而以较少的代码更改集实现更快的反馈周期。

持续测试和优化

写得不好的单元测试和验收测试及自动化测试可能是反馈主导的迭代软件开发的瓶颈。但是,更多的是测试团队的内部问题,而不是CI / CD的挑战。但是,仅专注于功能测试对于CI / CD管道来说是一个糟糕的连续测试实践。还应针对非功能性要求(例如性能测量和可靠性测试)编写测试用例,对测试也提出了更高的要求。

小结

变更可见性是希望我们能够清除的了解变更的内容、风险,同时也引进新的工具或技术来帮助我们提升改善变更的风险,只有通过工具或者平台才能有效改善当下所面临的问题,例如发布时间间隔长,发布效率、发布内容多等这方面的问题,都可以通过CICD来改善和解决,同时也能够认识并掌控新技术带来的挑战,这样才会给我们带来收益,引进新的技术目的就是对以往的方式或行为做革新,往往需要时间去适应。