跳转至

CI/CD

CI/CD是持续集成(Continuous Integration)和持续交付(Continuous Delivery)的缩写,它旨在通过自动化的流程和工具,提高软件开发的效率、质量和交付速度。 CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。 CI/CD 的核心概念是持续集成、持续交付和持续部署。它是作为一个面向开发和运营团队的解决方案,主要针对在集成新代码时所引发的问题(也称为:“集成地狱”)。 CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期(从集成和测试阶段,到交付和部署)。 这些关联的事务通常被统称为 CI/CD 管道,由开发和运维团队以敏捷方式协同支持。

CI 持续集成(Continuous Integration)

协同开发是目前主流的开发方式,也就是多位开发人员可以同时处理同一个应用的不同模块或者功能。

但是,如果企业计划在同一天,将所有开发分支代码集成在一起,最终可能会花费很多时间和进行很多重复劳动,费事费力。因为代码冲突是难以避免的。

如果开发人员本地的环境和线上不一致的话,那么这个问题就更加复杂了。

持续集成(CI)可以帮助开发者更加方便地将代码更改合并到主分支。

一旦开发人员将改动的代码合并到主分支,系统就会通过自动构建应用,并运行不同级别的自动化测试(通常是单元测试和集成测试)来验证这些更改,确保这些更改没有对应用造成破坏。

如果自动化测试发现新代码和现有代码之间存在冲突,CI 可以更加轻松地快速修复这些错误,使跨开发人员团队的代码集成过程更容易,提高软件质量,也减少发布新功能更新所需的时间。

下图表示从开发人员签入他们的代码到其自动构建,测试和构建状态的最终通知的工作流。

image-20250220195811087

一旦开发人员将代码提交到Git等版本控制系统,它就会触发CI管道,该管道获取更改并运行自动构建和单元测试。基于步骤的状态,服务器然后通知相关开发人员新代码到现有代码库的集成是成功还是失败。

这有助于更快地发现和解决错误,通过将开发人员从手动任务中解放出来,使团队更有效率,并帮助团队更频繁地向客户提供更新。已经发现,整合整个开发周期可以减少开发人员的时间约25 - 30%。

关键组件

  1. 版本控制系统(Version Control System,VCS):例如Git,用于跟踪代码变更,协作开发,并确保团队成员之间的代码同步。

  2. 自动化构建工具:如Jenkins、Travis CI、CircleCI等,用于在每次代码提交时自动触发构建过程。

  3. 单元测试框架:例如JUnit(Java)、pytest(Python),用于确保代码的基本功能在集成后仍然有效。

作用

  • 减少集成问题: 在传统的开发模式中,团队成员可能在各自的开发分支上独立工作,而在合并时可能会产生冲突和集成问题。CI通过持续集成代码,及时发现和解决这些问题,避免了集成地狱。
  • 提高代码质量: CI 强调自动化测试,包括单元测试、集成测试等。每次代码变更都会触发这些测试,确保新代码不会破坏现有功能,并减少引入 bug 的可能性。这有助于提高整体代码质量。
  • 快速反馈: CI 通过快速执行自动化构建和测试,提供了即时反馈。开发人员可以在提交代码后迅速得知其是否通过了构建和测试,帮助他们更快速地发现和修复问题。
  • 提高开发效率: 通过自动化构建、测试和部署,CI减少了手动操作的需求,提高了开发效率。开发人员可以专注于编写代码而不必花费过多时间在手动构建和测试上。
  • 自动化部署: 与持续交付(Continuous Delivery)和持续部署(Continuous Deployment)结合,CI 可以实现自动化部署。这意味着经过测试的代码变更可以自动部署到预定环境,实现快速且可靠的交付流程。
  • 团队协作: CI 鼓励团队成员频繁集成代码,确保大家的工作在一个共享的代码库中协同进行。这促进了团队之间的协作和沟通,减少了因代码集成问题而导致的沟通障碍。
  • 降低风险: 通过频繁集成和自动测试,CI 减少了发布到生产环境时出现问题的可能性。提前发现和解决问题有助于降低风险,确保稳定的软件交付。

CD 持续交付(Continuous Delivery)

持续交付帮助开发人员在类似于生产的环境中测试他们的代码,从而防止任何最后时刻或生产后的意外。这些测试可能包括UI测试,负载测试,集成测试等,它可以帮助开发人员提前发现和解决bug。

持续交付旨在建立一个可随时将开发环境的功能部署到生产环境的代码库。

在持续交付过程中,每个步骤都涉及到了测试自动化和代码发布自动化。

持续交付使整个软件发布过程自动化。部署到实际生产环境的最终决定可以由开发人员/项目负责人根据需要触发。

在流程结束时,运维团队可以快速、轻松地将应用部署到生产环境中。

这时,持续交付后的代码已经在主分支上了,这处于某个版本的待发布的状态,随时可以将开发环境的功能部署到生产环境中(部署到生成环境前还需要在测试环境性能测试、回归测试、自动化测试、人工测试等),运行脚本构建打包应用,通过自动化部署工具部署到生产环境运行应用,监控生产环境指标,如出现问题和错误,可以触发手动或自动回滚,如系统正常,则定期回顾,收集反馈,优化,并持续改进。

image-20250220195937685

关键组件

  1. 自动化部署工具:例如Docker、Ansible、Kubernetes等,用于自动化地部署应用程序和其依赖。

  2. 环境配置管理:工具如Terraform,确保不同环境(开发、测试、生产)的一致性。

  3. 持续监控和反馈:使用工具如Prometheus、Grafana,确保在部署后能够监控应用程序的性能和稳定性。

作用

  • 快速交付: 持续交付强调频繁、快速地将新的代码变更交付到生产环境。这使得团队能够更加迅速地响应用户需求,推出新功能或修复 bug。
  • 稳定交付: 通过自动化测试、自动化部署和验证流程,持续交付确保每次交付都是经过充分验证的,降低了引入错误的风险,提高了软件的稳定性。
  • 降低发布成本: 持续交付通过自动化流程降低了发布的人工成本。这意味着开发团队不再需要手动执行繁琐的部署步骤,减少了错误的可能性,提高了整体效率。
  • 支持持续改进: 持续交付是一个循环过程,通过不断收集用户反馈、监控系统性能和流程改进,团队能够不断优化持续交付流程,提高整体效率和质量。

CD 持续部署(Continuous Deployment)

对于一个完整、成熟的 CI/CD 管道来说,最后的阶段是持续部署。

它是作为持续交付的延伸,持续部署可以自动将应用发布到生产环境。

实际上,持续部署意味着开发人员对应用的改动,在编写完成后的几分钟内就能及时生效(前提是它通过了自动化测试)。这更加便于运营团队持续接收和整合用户反馈。

总而言之,所有这些 CI/CD 的关联步骤,都极大地降低了应用的部署风险。

不过,由于还需要编写自动化测试以适应 CI/CD 管道中的各种测试和发布阶段,因此前期工作量还是很大的。

CI和CD工作流

下图描述了持续集成与持续交付相结合如何帮助加快软件交付过程,降低风险并提高质量。

image-20250220200035146

CI/CD工具选择

image-20250220200113399

https://www.geeksforgeeks.org/what-is-ci-cd

https://blog.csdn.net/weixin_44268936/article/details/133753519

https://www.techtarget.com/searchsoftwarequality/CI-CD-pipelines-explained-Everything-you-need-to-know

https://www.geeksforgeeks.org/what-is-ci-cd/

评论