什么是CI/CD?

2022-07-21 09:23:21 digiproto
CI(Continuous Integration,持续集成)/CD(Continuous Delivery,持续交付/Continuous Deployment,持续部署)属于DevOps的概念,指将传统开发过程中的代码构建、测试、部署以及基础设施配置等一系列流程的人工干预转变为自动化。使用CI/CD,代码经由开发人员更改后,可进行自动化测试并完成交付和部署。恰当的CI/CD管道可使计算机停机时间最小化,从而更快发布代码。


01


什么是持续集成?

持续集成(CI,后续统称持续集成)要求软件开发团队的每个人定期共享其对代码库的更改,并在每次更改后检查代码质量。持续集成是DevOps中构建和发布软件的关键,通过自动化的实现缩短了反馈周期,促进了团队协作。


持续集成鼓励软件工程师将其对源代码/版本控制系统的更改(工作副本)提交到共享的版本控制存储库(合并到主干)中,从而共享其代码和单元测试用例,以便每个开发人员都能在相同的基础上进行构建。每次提交都会触发一次构建和一系列自动化测试,使问题能够尽早被发现。


敏捷开发和持续集成

持续集成不仅是DevOps的一个重要元素,还与敏捷开发密切相关。虽然采用DevOps或实现持续集成并不需要遵循敏捷开发的方法,但它们都根植于相同的原则。


软件开发人员的首要目标是为用户解决问题。当今世界软件的功能越来越丰富,与之相对应的开发过程也越来越复杂,在开发前期进行正确的构建显得尤为重要。敏捷开发的出现便是为了解决这个问题:敏捷开发旨在更短的周期内完成开发和交付,从而更快速、更方便地获得关于已构建内容的反馈,以作出相应调整。DevOps为缩短发布周期提供了技术和渠道,使开发人员可以利用持续集成、交付与部署的形式,实现更短的反馈循环。


持续集成的发展,是为了更好地应对开发团队在编写代码数月甚至数年之后,试图将多个独立开发人员的工作整合到一个产品中所面临的问题。传统开发过程中,如果各模块的依赖关系是在代码编写很久之后才确定的,在后续集成时通常需要进行大量返工,容易出现严重延误而影响软件交付时间的情况。


因此,与其等到所有代码都写完再进行集成,不如更加频繁地集成少量代码,并在每次集成时都进行自动化测试,以便开发人员及时收到反馈,尽早解决问题,提高代码质量。


持续集成的实践

持续集成的关键要素如下:

①包含整个代码库的源代码或版本控制系统,包括源代码文件、库、配置文件和脚本。

②自动构建脚本。

③自动化测试。

④运行构建和测试的基础设施。


1. 一切流程都是从开发人员提交代码开始的。为了让软件开发团队的每个人都能在相同的基础上进行构建,统一的存储库是必不可少的。开发人员应经常将各自对源代码或版本控制系统的更改共享至存储库(比如每人每天至少一次将其更改提交到主干)。


2. 提交更改的下一步是构建解决方案,并通过一系列自动化测试来验证行为正确性。自动化测试是持续集成的一个组成部分,因为手工构建和手动测试非常耗时且容易出错,无法达到每天进行集成的目标。开发团队应根据所用语言选择合适的构建工具和测试框架。


3. 脚本和测试就位后,进入运营、维护流程,即将自动化测试作为软件任何新功能的一部分,以处理软件故障、监控性能。

图片关键词

▲持续集成


4. 运营、维护的下一步是监视(或者说监控)。使用持续集成服务器来监视存储库、触发构建、运行自动化测试和搜集结果,有助于将这些部分整合在一起,节省编写自定义的自动化逻辑的时间,提供代码覆盖率指标和构建版本等其他信息,并将监视结果所带来的新需求反馈给开发人员,实现全流程的循环往复。


以上工具和流程是实现持续集成的重要组成部分,但要真正实现持续集成,还需要开发人员的普遍认可。软件开发团队需要调整工作流程与模式,包括定期将代码提交到主干、为新特性添加自动化测试、在出现问题时优先修复构建等,并与QA(Quality Assurance,质量保证)团队充分合作,确定优先级、设计方案及维护自动化测试。除此之外,开发人员还应与基础架构工程师合作进行构建和测试等工作,打破组织“竖井”。


持续集成带来的挑战

对于许多公司来说,持续集成是对现有工作流程进行巨大改变的新兴概念,接受起来并不轻松。想要落实持续集成,公司需要极其良好的沟通来协调团队之间的工作,培养协作文化。


持续集成还会遇到更实际的挑战:处理大型、单一的应用程序时,构建过程可能会变得很慢;如果出现测试环境供应不足的情况,自动化测试也将会遇到阻碍。


综上所述,了解持续集成的流程并明确其应用瓶颈,将有助于企业量化并掌握部署持续集成时所需的架构变更、增设基础设施、实行自动化测试覆盖率等动作的成本和收益。


02


什么是持续交付/持续部署?

持续交付(Continuous Delivery,以下统称持续交付)和持续部署(Continuous Deployment,以下统称持续部署)的简称都是CD。


持续交付与持续部署的区别是什么?

持续交付和持续部署都是持续集成的下一环,其区别就在于持续交付对生产环境的部署中依然有手动确认的环节,而持续部署实现了部署过程的自动化。持续部署将DevOps自动化构建、测试和部署的实践发挥到了极致:如果对代码的更改成功地通过了之前的所有阶段,那么该更改将自动部署到生产环境中,无需任何手动干预。采用可靠的持续部署流程意味着开发人员可以在不影响软件质量的情况下,尽可能快地为用户提供新特性,甚至可以在一天实现多次软件发布。

图片关键词

▲持续交付与持续部署


持续部署的实现形式

能够快速交付产品并快速响应用户反馈,逐渐成为当前企业越来越重要的竞争优势。持续部署的成效取决于完全自动化的构建、测试和部署过程,确保速度的提升不会以质量为代价。


目前主流的持续部署模式有:

1.金丝雀部署(Canary Deployment),也称灰度部署,指在将更改后的代码推广到整个服务集群并对所有人可用之前,先将其推广到一小部分用户进行测试,并持续观测发布对象各个维度的状态,以验证新版本的功能性、可用性、稳定性。

图片关键词

▲金丝雀部署


2.蓝绿部署(Blue-Green Deployment)是一种应用发布模式,指将用户从先前版本的应用或微服务逐渐转移到几乎相同的新版本中(两者均保持在生产环境中运行)。在该种部署方式下,开发人员需维护两个相同的主机环境:蓝色——旧版本的生产环境;绿色——新版本的预发布环境。一旦流量从蓝色完全转移到绿色,蓝色就可在回滚或退出生产的情况下保持待机,也可更新成为下次更新的模板。


在任何时候,其中一个(例如蓝色)主机环境都处于活动状态。新版本的软件在绿色环境中进行最后的测试,一旦软件在绿色环境中运行,就可以切换路由器,以便所有传入请求都进入绿色环境——此时蓝色环境处于空闲状态。


蓝绿部署还提供了快速回滚的方法:出现问题后可将路由器切换回蓝色环境。在绿色环境处于活动状态时,如果发生丢失问题,开发者可在绿色环境处于活动状态时将蓝色环境作为备份,或者在切换环境前将应用程序置于只读模式,以只读模式运行一段时间,问题解决后然后再将其切换为读写模式。

图片关键词

▲蓝绿部署


3、暗启动部署(Dark Launching)也称功能开关部署。在软件正式发布前,开发人员先将其部署到生产环境,通过应用“开关”技术,使用户在无感的情况下使用新特性的功能,进而通过收集用户的实际操作记录来获得针对这个新特性的反馈数据。新特性通常不会体现在用户经常使用的界面上,更多是对后台交互逻辑或算法层面的调整。同时,开发人员可添加功能开关,以便在新功能部署到生产环境后发现问题时及时进行关闭。

图片关键词

▲暗启动部署


持续部署的注意事项

软件开发的生命周期不仅涉及代码更改,还涉及到用户研究、产品营销、交互设计、文档维护、法律和支持团队等多个维度。因此,采用持续部署时通常也会出现一些问题。


如果没有打好前期基础,软件开发团队并未对持续部署有过深入了解,仓促进行持续部署很可能使团队无法及时适应,遭到抵触,进而产生手动测试复现的情况,轻则速度放慢,重则直接导致持续部署的失败。


因此,营造团队内部协作的文化至关重要。在整个开发过程中,应尽早汇总所有团队在设计、安全问题、术语或合规性方面的需求,并明确发布的准确时间点。


另外,开发人员在开发更复杂的功能时,仅仅简单地在每个更改提交通过测试后将其部署到运行状态,结果并不一定理想。为解决这一问题,开发人员可以使用功能标志,控制生产环境中的代码可见性,实时监控意外故障;或者使用不会自动推送到部署的独立分支。


更多CI/CD相关内容,欢迎点击link或访问 www.digiproto.com 进行了解!


参考资料:

https://www.jetbrains.com/teamcity/ci-cd-guide/continuous-integration/

https://about.gitlab.com/topics/ci-cd/

https://docs.microsoft.com/zh-cn/devops/develop/what-is-continuous-integration

https://zhuanlan.zhihu.com/p/259915180



首页
产品
新闻
联系