架构设计系列(二):CI/CD

一、概述

CI/CD 是 持续集成(Continuous Integration) 和 持续交付/持续部署(Continuous Delivery/Continuous Deployment) 的缩写,是现代软件开发中的一套核心实践和工具链,旨在提高软件交付的效率、质量和可靠性。

二、CICD 在软件开发周期的应用

在软件开发周期中包含着几个关键节点如:编码、测试、部署及维护。CI/CD通过自动化工具和流程,将 软件开发周期 的各个阶段紧密集成,从而实现更快、更可靠的软件发布。

当开发人员提交代码至代码仓库的时候,就会触发自动构建和测试流程,运行端到端的测试用例去验证可执行代码。如果测试通过则将自动部署至对应的环境,如果发现bug则将对应代码回退并告知开发修复bug。CICD 帮助团队实现快速、可靠的软件交付。

2.1 软件开发生命周期(SDLC)

SDLC 是软件开发从开始到结束的完整过程,通常包括以下几个关键阶段:

  • 开发(Development):
    开发人员编写代码,实现功能需求。
    代码提交到版本控制系统(如 Git)。
  • 测试(Testing):
    对代码进行各种测试,包括单元测试、集成测试、端到端测试等。
    确保代码质量并发现潜在问题。
  • 部署(Deployment):
    将测试通过的代码部署到生产环境或预发布环境(如 staging)。
  • 维护(Maintenance):
    监控生产环境,修复问题,优化性能,并根据需求更新功能。

2.2 CI/CD 如何自动化 SDLC

CI/CD 通过自动化工具和流程,将 SDLC 的各个阶段紧密集成,从而实现更快、更可靠的软件发布。以下是 CI/CD 在 SDLC 中的具体作用:

  • 持续集成(CI)
    • 触发条件:
      当代码被推送到 Git 仓库时,CI 工具(如 Jenkins、GitLab CI)会自动触发构建和测试流程。
    • 构建与测试:
      代码被拉取并编译(如果需要)。
      运行单元测试、集成测试等,验证代码的正确性。
    • 快速反馈:
      如果测试通过,代码被认为是可用的。
      如果测试失败,开发人员会立即收到通知,并需要修复问题。
  • 持续交付/持续部署(CD)
    • 测试通过后:
      代码可以自动部署到预发布环境(staging)或生产环境(production)。
      在持续交付中,部署到生产环境需要人工审批。
      在持续部署中,部署到生产环境是自动化的,无需人工干预。
    • 端到端测试(E2E):
      在部署前或部署后,运行端到端测试,验证整个系统的功能是否正常。
    • 问题处理:
      如果在测试或部署过程中发现问题,代码会被退回开发阶段进行修复。

三、CI与CD的区别

3.1 持续集成(CI,Continuous Integration)

CI 是一种开发实践,旨在通过频繁地将代码变更集成到共享的主干分支(如 mainmaster 分支),并自动运行构建和测试,来快速发现和修复集成问题。其主要的功能职责有:

  • 自动化构建:每次代码提交后,自动拉取代码并编译(如果需要)。
  • 自动化测试:运行单元测试、集成测试等,验证代码的正确性。
  • 快速反馈:如果测试失败,开发人员会立即收到通知,并需要修复问题。

CI的工具主要有Jenkins、GitLab CI、CircleCI、Travis CI 等。主要用于开发阶段,用于确保代码变更不会破坏现有功能。适合需要频繁集成代码的团队。

3.2 持续交付(CD,Continuous Delivery)

CD 是 CI 的延伸,专注于自动化发布流程,确保软件可以随时可靠地部署到生产环境。它通过自动化工作流,将代码变更从开发环境推送到生产环境。其主要功能包括:

  • 自动化部署:将测试通过的代码自动部署到预发布环境(如 staging)。
  • 人工审批:在部署到生产环境之前,通常需要人工确认。
  • 自动化测试:除了 CI 中的测试外,还可能包括用户验收测试(UAT)和性能测试。

与 CI 工具类似,通常结合部署工具(如 Kubernetes、Ansible)。它的作用是在发布阶段确保代码变更可以安全地部署到生产环境。适合需要频繁发布但需要人工控制的团队。

3.3. CI 和 CD 的区别
特性 持续集成(CI) 持续交付(CD) 持续部署(CD)
核心目标 尽早发现集成问题,确保代码质量。 确保软件可以随时可靠地发布。 完全自动化地将代码变更部署到生产环境。
自动化范围 构建和测试。 构建、测试和部署到预发布环境。 构建、测试和部署到生产环境。
人工干预 无需人工干预。 部署到生产环境前需要人工审批。 无需人工干预。
适用阶段 开发阶段。 发布阶段。 发布阶段。
工具示例 Jenkins、GitLab CI、CircleCI。 Jenkins、GitLab CI、Kubernetes。 Jenkins、GitLab CI、Kubernetes。

3.4. CI 和 CD 的关系

  • CI 是 CD 的基础:持续集成确保代码变更的质量,持续交付和持续部署在此基础上实现自动化发布。
  • CI + CD 的完整流程
  1. 开发人员提交代码 → 2. CI 工具自动构建和测试 → 3. 测试通过后,CD 工具将代码部署到预发布环境 → 4. 人工审批后(持续交付)或自动(持续部署)部署到生产环境。

四、Netflix 的工程实践 (CI/CD Pipeline)

下图涵盖了Netflix开发团队从计划到监控的完整开发流程

  • 计划(Planning)
    开发团队通过 JIRA 创建任务、分配工作并跟踪进度。
    在 Confluence 中记录设计文档、技术规范和会议记录。
  • 编码(Coding)
    Java是 后端服务的主要编程语言,其稳定性和生态系统适合 Netflix 的大规模分布式系统。当然根据具体需求,可能使用其他语言、来处理特定任务。
  • 构建(Build)
    Gradle是主要的构建工具,用于编译代码、管理依赖和打包应用。Netflix 开发了自定义的 Gradle 插件,以支持特定的构建需求。
  • 打包(Packaging)
    将应用程序和依赖打包成 Amazon Machine Image (AMI),用于在 AWS 上部署。
  • 测试(Testing)
    Netflix 强调通过混沌工具(如 Chaos Monkey)主动引入故障,测试系统的弹性和可靠性。
  • 部署(Deployment)
    Netflix 自建的持续交付平台,支持金丝雀发布(Canary Release)等高级部署策略。
  • 监控(Monitoring)
    Netflix 使用 Atlas监控系统,集中收集和展示各项指标(如 CPU 使用率、请求延迟)。Kayenta用于检测异常,支持金丝雀分析和自动回滚。
  • 事件处理(Incident Report)
    PagerDuty用于事件调度和处理,根据优先级通知相关人员。
相关推荐
shuair1 小时前
idea 2023.3.7常用插件
java·ide·intellij-idea
小安同学iter1 小时前
使用Maven将Web应用打包并部署到Tomcat服务器运行
java·tomcat·maven
Yvonne9781 小时前
创建三个节点
java·大数据
不会飞的小龙人2 小时前
Kafka消息服务之Java工具类
java·kafka·消息队列·mq
是小崔啊3 小时前
java网络编程02 - HTTP、HTTPS详解
java·网络·http
brevity_souls3 小时前
Spring Boot 内置工具类
java·spring boot
小钊(求职中)4 小时前
Java开发实习面试笔试题(含答案)
java·开发语言·spring boot·spring·面试·tomcat·maven
shix .4 小时前
什么是tomcat
java·tomcat
java技术小馆4 小时前
Deepseek整合SpringAI
java·spring cloud
bug404_4 小时前
分布式大语言模型服务引擎vLLM论文解读
人工智能·分布式·语言模型