Skip to content

持续集成与持续部署

持续集成与持续部署(CI/CD)是现代软件工程的核心实践,通过自动化构建、测试、部署流程,实现快速、可靠的软件交付。CI/CD 将繁琐的手工操作转化为可重复的自动化流程,让团队能够频繁发布代码变更,同时保持系统稳定。

持续集成 CI

持续集成要求开发人员频繁将代码集成到共享分支,每次集成都通过自动化构建和测试来验证。CI 的目标是尽早发现集成错误,减少问题修复成本。

CI 核心实践

频繁提交:开发人员应该每天至少提交一次代码,小步快跑比大规模集成更安全。

自动化构建:每次代码提交触发自动构建,编译代码、打包依赖、生成可部署产物。

自动化测试:构建后运行自动化测试套件,包括单元测试、集成测试、静态分析。

快速反馈:构建和测试应该快速完成(通常在 10 分钟内),让开发者迅速获得反馈。

修复优先:构建失败时,团队优先修复问题,禁止在失败状态下继续开发。

CI 流水线设计

检出代码:从版本控制系统(如 Git)拉取最新代码。

安装依赖:根据包管理文件(package.json、pom.xml、go.mod)安装依赖。

代码检查:运行静态分析工具(ESLint、SonarQube)检查代码质量。

构建产物:编译代码、打包资源、生成 Docker 镜像。

运行测试:执行测试套件,收集测试覆盖率。

部署产物:将构建产物发布到制品库(如 Nexus、Docker Registry)。

通知结果:通过邮件、钉钉、Slack 通知构建结果。

持续交付 CD

持续交付在持续集成的基础上,确保代码可以随时部署到生产环境。CD 区分为持续交付(手动触发部署)和持续部署(自动部署)。

CD 核心实践

环境一致性:开发、测试、生产环境尽可能一致,避免环境差异导致问题。

部署自动化:部署流程完全自动化,减少人为错误。

零停机部署:使用蓝绿部署、滚动更新实现零停机发布。

快速回滚:部署失败时能够快速回滚到上一个稳定版本。

特性开关:通过配置控制功能开关,实现功能灰度发布和快速关闭。

部署策略

蓝绿部署:维护两套环境(蓝和绿),部署新版本到空闲环境,测试通过后切换流量。优势:零停机、快速回滚。问题:资源成本翻倍。

滚动更新:逐个替换实例,逐渐将流量切换到新版本。优势:资源利用率高。问题:新旧版本共存,可能影响兼容性。

金丝雀发布:先发布到少量实例(金丝雀),观察指标正常后逐步扩大范围。优势:风险可控。问题:发布周期长。

灰度发布:根据用户特征(如地区、用户 ID)路由流量到不同版本,实现精细化发布。优势:精准控制。问题:实现复杂。

CI/CD 工具链

Jenkins

Jenkins 是开源的自动化服务器,插件生态丰富,高度可定制。

Jenkins Pipeline:使用 Jenkinsfile 定义流水线,支持声明式和脚本式语法。

多分支流水线:为每个分支创建独立的流水线,支持 PR 自动触发。

插件生态:超过 1800 个插件,几乎集成所有开发工具。

GitLab CI/CD

GitLab CI/CD 内置于 GitLab,使用 .gitlab-ci.yml 定义流水线。

内置集成:无需额外安装,与 Git 仓库无缝集成。

Docker 支持:原生支持 Docker 构建和运行。

环境管理:支持定义多个环境,手动触发部署。

GitHub Actions

GitHub Actions 是 GitHub 的 CI/CD 平台,使用 YAML 文件定义工作流。

市场集成:丰富的第三方 Action,轻松集成各种服务。

矩阵构建:支持多操作系统、多版本并行测试。

自托管 Runner:支持私有服务器运行工作流。

ArgoCD

ArgoCD 是 Kubernetes 的持续部署工具,采用 GitOps 模式。

声明式:Git 仓库是单一事实来源,自动同步状态。

可视化:提供应用拓扑图,清晰展示部署状态。

回滚:支持应用历史版本回滚。

GitOps 实践

GitOps 是一种Ops 实践,使用 Git 作为单一事实来源,自动化同步基础设施和应用配置。

GitOps 核心原则

声明式:系统状态声明式描述,存储在 Git 中。

版本化:所有变更通过 Git 提交,可审计、可回滚。

自动同步:自动化工具监控 Git 变更,同步到目标系统。

持续协调:工具持续监控实际状态与期望状态,自动纠正偏差。

GitOps 优势

提高生产力:开发者无需直接操作集群,通过 PR 即可部署。

增强可靠性:Git 提供历史记录、回滚、权限控制。

快速恢复:配置错误时快速回滚到上一个稳定状态。

合规审计:Git 提交记录天然就是审计日志。

质量门禁

质量门禁是在流水线中设置的质量检查点,只有通过检查才能进入下一阶段。

门禁类型

代码覆盖率:要求测试覆盖率不低于阈值(如 80%)。

静态分析:运行静态分析工具,禁止严重问题通过。

安全扫描:扫描依赖漏洞,禁止高风险依赖。

性能测试:运行性能测试,要求响应时间、吞吐量达标。

人工审查:代码审查通过后才能合并到主分支。

门禁配置

分级门禁:不同分支设置不同门禁级别,主分支要求最严格。

条件门禁:变更范围大时触发更多检查(如全量回归测试)。

豁免机制:紧急修复可豁免部分门禁,需要审批记录。

CI/CD 是现代软件工程的基础设施,理解 CI/CD 的原理和实践,有助于构建快速、可靠的交付体系。