什么是 CI/CD?持续集成和持续交付

⚡ 智能摘要

持续集成是一种软件开发实践,团队成员每天至少将他们的工作合并到一个共享存储库中,每次提交都会触发自动构建和测试,以便及早发现集成错误。

  • 🔄 定义: 开发人员每天都会集成代码,每次提交都会通过自动构建进行验证。
  • 🚚 CI 与 CD: CI 对每一次变更都进行测试;持续交付确保软件随时可以发布。
  • 🧪 管道: 提交操作会在一个连续的流程中触发构建、测试和部署阶段。
  • 🧰 工具: Jenkins, Bamboo和 TeamCity 实现构建和测试自动化。
  • 📉 受益: 早期、频繁的测试意味着更少的漏洞和更快、更安全的发布。
  • 🤖 人工智能协助: AI 工具可以自动检测不稳定的测试并分诊构建失败。

什么是 CI/CD

什么是持续集成(CI)?

持续整合 是一种软件开发方法,团队成员每天至少集成一次他们的工作。每次集成都会通过自动化构建进行验证,以检测错误。该概念于二十多年前提出,旨在避免“集成地狱”,即集成被推迟到项目后期才进行的情况。

代码提交后,软件会立即进行构建和测试。在拥有众多开发人员的大型项目中,每天会发生多次提交。每次提交后,代码都会被构建和测试;如果测试通过,则检查构建版本是否符合部署要求;如果部署成功,则将代码推送到生产环境。这种提交、构建、测试和部署的循环是持续进行的,这也是这种实践名称的由来。

什么是持续交付(CD)?

连续交付 是一种软件工程方法,团队以短周期开发软件,并确保软件能够随时可靠地发布。其目标是快速、频繁地构建、测试和发布软件,从而降低频繁生产更新带来的成本、时间和风险。

CI和CD之间的区别

持续整合 持续交付是一种自动测试代码库中每个更改的方法,而持续交付则是一种安全快速地将新功能、配置和错误修复等更改引入生产环境的方法。

不使用持续集成 (CI) 的开发与使用持续集成 (CI) 的开发

无需 CI 的开发 使用 CI 进行开发
漏洞很多 更少的错误
不频繁提交 定期提交
发布频率低且速度慢 定期发布工作版本
整合困难 轻松有效的集成
测试进行得很晚 测试进行得早且频繁。
问题更难解决 问题能更快地被发现和解决。
项目可见性差 更好的项目可见性

编译与持续集成的区别

编译只是将代码转换为机器语言,而持续集成则执行更多更广泛的活动:

  • 数据库集成: 保持数据库和代码同步,并自动创建数据库和测试数据。
  • Code 检查: 确保代码库健康,及早发现问题,并应用最佳实践。
  • 自动化部署: 允许您随时发布产品,并使其始终处于可演示状态。
  • 文档生成: 保持文档更新,并生成构建报告和指标。
  • 汇编: 将高级代码转换为机器语言,并确保它能在每个目标平台上编译。

理想情况下,构建过程应从命令行运行,而不是依赖于 IDE,在专用的 CI 服务器上持续进行(而不是 cron 作业),每次提交代码时都会触发,并且无需开发人员付出任何努力即可提供即时反馈。

开展持续改进流程需要哪些条件?

  • 版本控制系统(VCS): 一种可靠的方法,可以集中管理和保存项目随时间推移所做的更改。
  • 虚拟机: 一台备用服务器,或者至少一台 虚拟机 来构建您的系统。
  • 托管式 CI 工具解决方案: 为了避免管理服务器,托管解决方案可以维护整个流程,并提供更易于扩展性。
  • 工具: 如果您选择自托管版本,请安装 CI 工具,例如: Jenkins, TeamCity, Bamboo或者 GitLab。

持续集成是如何工作的?

诺基亚就是一个老例子,它曾经使用一种叫做“夜间构建”的流程。白天,许多开发人员会提交多次代码,然后软件会在每晚进行构建。由于每天只构建一次,因此在庞大的代码库中隔离、识别和修复错误非常困难。

Later 团队采用了持续集成。开发人员提交代码后,软件会立即构建并进行测试,因此任何错误都能立即被发现,负责的开发人员也能迅速修复缺陷。

CI 的特点

  • 允许您维护一个单一的源代码库。
  • 允许您测试生产环境的克隆版本,该版本与生产环境非常接近。
  • 始终提供最新版本。
  • 使整个构建、测试和部署过程对所有利益相关者可见。

为什么要使用 CI?

  • 帮助您构建更高质量的软件并进行可重复的测试。
  • 扩大工程团队的交付产出,并允许开发人员并行开发功能。
  • 提高团队内部的透明度和沟通效率。
  • 当出现问题时,能够立即提供反馈,并通过加快部署速度和提高部署的可预测性来降低风险。
  • 避免发布时出现最后一刻的混乱。

CI系统使用最佳实践

  • 尽早提交代码,并经常提交,但永远不要提交有问题的代码。
  • 立即修复构建失败并根据指标采取行动。
  • 在每个目标环境中构建,并从每次构建中创建工件。
  • 实现构建自动化,使其不依赖于集成开发环境 (IDE)。
  • 当所有内容发生更改时,包括数据库架构,都需要重新构建和测试。
  • 保持构建速度快,并使用自动化部署。

CI 的缺点

  • 使用 CI 服务器需要一定的初始设置时间和培训时间。
  • 必须制定合适的测试程序,而构建完善的测试套件需要大量资源。
  • 需要转换熟悉的流程,并且需要额外的服务器和环境。
  • 当多个开发者同时想要集成他们的代码时,可能会出现等待时间。

CI流程工具

Jenkins

Jenkins 是一个用编程语言编写的开源持续集成工具。 Java它有助于对大型代码库中的孤立变更进行实时测试和报告,并帮助开发人员快速发现和解决缺陷,同时实现构建测试的自动化。

Bamboo

Bamboo 是一个持续集成构建服务器,可在同一平台上执行自动化构建、测试和发布。它与 Jira 无缝集成。 Bitbucket 它支持多种技术,例如 Docker、Git、SVN、Mercurial 和 AWS。

TeamCity

TeamCity 是一个功能强大的持续集成服务器。即使没有构建运行,它也能保持 CI 服务器的健康稳定运行,并为任何项目提供更高的代码质量。

常见问题

持续交付确保每次变更都可发布,并需经人工审批才能部署到生产环境。持续部署则取消了这一环节,自动发布所有通过流水线的变更。

典型的流水线包括源码、构建、测试、发布和部署阶段。 Code 提交到版本控制系统后,文件会被编译、自动测试,然后准备并发布到生产环境。

集成地狱是指将许多开发人员的变更(这些变更通常保存到项目后期)痛苦地合并在一起的过程。持续集成(CI)通过持续集成和测试小的变更来避免集成地狱。

尽早且频繁地提交代码,至少每天一次,每次提交的增量要小。频繁提交可以确保变更易于测试、易于合并,并且在需要时易于回滚。

构建产物是构建过程的打包输出,例如 JAR 文件、容器镜像或二进制文件。为了保持一致性,测试和生产环境都使用相同的构建产物。

自托管的持续集成 (CI) 系统运行在您管理的服务器上,提供完全控制权,但维护工作量更大。托管(云)CI 系统由服务提供商维护,无需管理基础设施即可轻松扩展。

AI能够预测变更后需要运行哪些测试,优先处理风险区域,并自动对故障进行分类。这缩短​​了反馈时间,并随着代码库的增长保持流水线的快速运行。

是的。机器学习模型可以发现测试结果不一致(通过和失败的情况)、集群相关的构建失败,并找出可能的根本原因。ping 团队确保了管道的可靠性。

总结一下这篇文章: