持续集成与持续部署
持续集成与持续部署(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 的原理和实践,有助于构建快速、可靠的交付体系。