CI(Continuous Integration,持续集成) 与CD(Continuous Delivery,持续交付;Continuous Deploy,持续部署)


什么是CI/CD

CI/CD 是持续集成和持续交付/部署的缩写,旨在简化并加快软件开发生命周期。

持续集成(CI)是指自动且频繁地将代码更改集成到共享源代码存储库中的做法。持续交付或持续部署(CD)是一个由两部分组成的过程,涉及代码更改的集成、测试和交付。持续交付不会自动部署到生产环境,持续部署则会自动将更新发布到生产环境。

img这些关联的事务通常被统称为“CI/CD 管道”,由开发和运维团队以敏捷方式协同支持,采用的方法不是 DevOps 就是站点可靠性工程(SRE)。

持续集成(CI)

持续集成是一种面向开发人员的自动化流程,有助于更频繁地将代码更改合并回共享分支或“主干”。进行这些更新时,会触发测试步骤的自动执行,以确保合并代码更改的可靠性。

如何工作
在现在的开发模式中,一般的项目,协同开发是离不开的,这就涉及到多个开发人员编写处理自己负责的功能模块或者某些开发人员共同负责一个模块。但是,如果企业组织安排在一天内将所有分支源代码合并在一起(称为“合并日”),最终可能造成工作繁琐、耗时,而且需要手动完成。

这是因为当某个开发人员单独对应用进行更改时,可能会与其他开发人员同时进行的其他更改发生冲突。如果每个开发人员都自定义自己的本地集成开发环境(IDE),而不是让团队就一个基于云的 IDE 达成一致,那么就会让问题更加雪上加霜。

CI 可被视为一种解决方案,用于解决同时开发的应用因分支过多而可能相互冲突的问题。

一旦提交请求合并到主分支,自动化构建工具运行不同级别的自动化测试(通常是单元测试和集成测试)来进行验证,以确保相应更改不会破坏应用。

关键组件

  1. 版本控制系统(Version Control System,VCS)
    例如Git,用于跟踪代码变更,协作开发,并确保团队成员之间的代码同步。
  2. 自动化构建工具
    如Jenkins、Travis CI、CircleCI等,用于在每次代码提交时自动触发构建过程。
  3. 单元测试框架
    例如JUnit(Java)、pytest(Python),用于确保代码的基本功能在集成后仍然有效。

作用

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

持续交付(CD)

持续交付是指自动执行 CI 中的构建、单元测试和集成测试后,自动将经过验证的代码发布到存储库。因此,要实现有效的持续交付流程,将 CI 内置到开发管道中显得非常重要。

在持续交付中,从合并代码更改到交付生产就绪型版本,每个阶段均涉及测试的自动化及代码发布的自动化。整个流程结束后,运维团队便可以迅速将应用部署到生产环境。

持续交付通常意味着对开发人员对应用所做的更改自动进行错误测试并将其上传到存储库(如 GitHub 或容器镜像仓库),然后由运维团队将其部署到实时的生产环境。它可以解决开发团队和业务团队之间的可见性和沟通不佳的问题。为此,持续交付的目的就是拥有一个可随时部署到生产环境的代码库,并确保以最少的工作量部署新代码。

关键组件

  1. 自动化部署工具
    例如Docker、Ansible、Kubernetes等,用于自动化地部署应用程序和其依赖。
  2. 环境配置管理
    工具如Terraform,确保不同环境(开发、测试、生产)的一致性。
  3. 持续监控和反馈
    使用工具如Prometheus、Grafana,确保在部署后能够监控应用程序的性能和稳定性。

作用

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

什么是持续部署?

成熟的 CI/CD 管道的最后一个阶段是持续部署。持续部署是持续交付的延伸,可以指自动将开发人员的更改从存储库发布到生产环境,以供客户使用。

CD 解决了运维团队因手动流程过多导致应用交付速度变慢的问题。持续部署以持续交付的优势为根基,实现了管道后续阶段的自动化。

实际上,持续部署意味着开发人员对云应用的更改在编写后的几分钟内就能生效(假设它通过了自动化测试)。这使得持续接收和整合用户反馈变得更加容易。综上所述,所有这些相互关联的 CI/CD 事务均能降低应用部署的风险,从而更轻松地以小块的形式发布对应用的更改,而不是一次性发布所有更改。

然而,由于在生产前的管道阶段没有人工关卡,因此,持续部署在很大程度上依赖于精心设计的测试自动化。这意味着持续部署可能需要大量的前期投入,因为需要编写自动化测试以适应 CI/CD 管道中的各种测试和发布阶段。

CI/CD工具

GitLab CI

GitLab 是 CI/CD 领域的一个新手玩家,但它已经在 Forrester Wave 持续集成工具中占据了领先地位。在这样一个竞争对手众多而水平又很高的领域,这是一项巨大的成就。是什么让 GitLab CI 如此了不起?
- 它使用 YAML 文件来描述整个管道。
- 它还有一个功能叫 Auto DevOps,使比较简单的项目可以自动构建内置了若干测试的管道。
- 使用 Herokuish 构建包来确定语言以及如何构建应用程序。有些语言还可以管理数据库,对于构建新的应用程序并在开发过程一开始就将其部署到生产环境中,这是一个很重要的功能。
- 提供到 Kubernetes 集群的原生集成,并使用多种部署方法的一种(如基于百分比的部署和蓝绿部署)将应用程序自动部署到 Kubernetes 集群中。
- 除了 CI 功能之外,GitLab 还提供了许多补充功能,比如自动把 Prometheus 和你的应用程序一起部署,实现运行监控;使用 GitLab 问题(Issues)、史诗(Epics)和里程碑(Milestones)进行项目组合和项目管理;管道内置了安全检查,提供跨多个项目的聚合结果;使用 WebIDE 在 GitLab 中编辑代码的能力,它甚至可以提供预览或执行管道的一部分,以获得更快的反馈。

Jenkins

Jenkins 是 CI/CD 领域中一款最早的、久负盛名的工具,是事实上的标准。对于大多数非开发人员来说,Jenkins 可能会是一个不小的负担,并且长期以来也一直是其管理员的负担。然而,这些都是他们想要解决的事项。

Jenkins 配置即代码(JCasC)应该有助于解决困扰管理员多年的复杂配置问题。和其他 CI/CD 系统类似,它允许通过 YAML 文件实现 Jenkins 主节点的零接触配置。Jenkins Evergreen 的目标是通过提供基于不同用例的预定义 Jenkins 配置来简化这个过程。这些发行版应该比标准的 Jenkins 发行版更容易维护和升级。

Jenkins 2 引入了具有两种管道类型的原生管道功能。当你在做一些简单的事情时,这两种方法都不像 YAML 那么容易操作,但是它们非常适合处理更复杂的任务。

Jenkins X 是 Jenkins 的彻底转变,很可能是原生云 Jenkins 的实现(或者至少是大多数用户在使用原生云 Jenkins 时会看到的东西)。它将使用 JCasC 和 Evergreen,并在 Kubernetes 本地以最佳的方式使用它们。对于 Jenkins 来说,这是激动人心的时刻。

参考文献

深入理解CI/CD:构建、测试和部署的完整流程_cicd自动化部署流程-CSDN博客
什么是 CI/CD?
什么是CI/CD,以及我所熟知的CI/CD工具都是有哪些?_ci cd 工具是什么-CSDN博客