一、概述
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 是一种开发实践,旨在通过频繁地将代码变更集成到共享的主干分支(如 main
或 master
分支),并自动运行构建和测试,来快速发现和修复集成问题。其主要的功能职责有:
- 自动化构建:每次代码提交后,自动拉取代码并编译(如果需要)。
- 自动化测试:运行单元测试、集成测试等,验证代码的正确性。
- 快速反馈:如果测试失败,开发人员会立即收到通知,并需要修复问题。
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 的完整流程:
- 开发人员提交代码 → 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用于事件调度和处理,根据优先级通知相关人员。