# 第28天:CI/CD——代码从提交到上线的自动化流水线 ## 今天你将学到什么 今天学习 CI/CD(持续集成/持续部署)——让代码从开发者提交到最终上线的整个过程自动化。不再需要手动打包、手动上传、手动重启服务器。 --- ## 为什么需要 CI/CD ### 没有 CI/CD 的世界 传统的部署流程: 1. 开发者写完代码,在本地测试通过 2. 把代码打包成压缩文件,通过 FTP 上传到服务器 3. SSH 登录服务器,停止旧服务 4. 解压新代码,安装依赖 5. 启动新服务,祈祷不出问题 6. 出问题了?手动回滚到上一个版本 **问题**: - 容易出错(手动操作步骤多) - 速度慢(一次部署可能要半小时) - 不敢频繁部署(怕出问题) - 回滚困难(上一个版本在哪?) - 不同人部署方式不一样("你是怎么部署的?") ### 有 CI/CD 的世界 ``` 开发者提交代码 → 自动测试 → 自动构建 → 自动部署 → 上线完成 ``` 整个过程自动化、可重复、可追溯。出问题一键回滚。 **类比**:CI/CD 就像工厂的自动化生产线。原材料(代码)放上去,经过一道道自动化工序(测试、构建、部署),最终产出成品(上线的应用)。不需要工人在每个环节手动操作。 --- ## CI 和 CD 分别是什么 ### CI(Continuous Integration)持续集成 **核心思想**:开发者频繁地把代码合并到主分支,每次合并都自动运行测试。 ``` 开发者提交代码 ↓ 自动拉取代码 ↓ 自动运行测试(单元测试、集成测试) ↓ 测试通过? ├── 是 → 代码合并成功 ✓ └── 否 → 通知开发者修复 ✗ ``` **好处**: - 问题早发现(提交后几分钟就知道有没有 bug) - 避免"集成地狱"(多人同时开发,最后合并时冲突一堆) ### CD(Continuous Delivery / Deployment)持续交付/部署 **持续交付**:代码随时可以部署到生产环境(但需要人工点击"部署"按钮)。 **持续部署**:代码通过所有测试后自动部署到生产环境(全自动,无需人工干预)。 ``` CI 通过 ↓ 自动构建(打包、生成镜像) ↓ 自动部署到测试环境 ↓ 自动运行集成测试 ↓ 部署到生产环境(自动或手动审批) ``` --- ## AWS 的 CI/CD 服务 AWS 提供了一套完整的 CI/CD 工具链: | 服务 | 作用 | 类比 | |------|------|------| | CodeCommit | 代码仓库 | 类似 GitHub(存放代码) | | CodeBuild | 构建服务 | 编译代码、运行测试、生成产物 | | CodeDeploy | 部署服务 | 把构建产物部署到服务器 | | CodePipeline | 流水线编排 | 把上面的步骤串联成自动化流程 | ### CodePipeline——流水线的指挥官 CodePipeline 把各个阶段串联起来: ``` 源代码阶段 构建阶段 部署阶段 (CodeCommit/ (CodeBuild) (CodeDeploy/ GitHub) ECS/Lambda) ↓ ↓ ↓ 代码变更触发 → 编译+测试+打包 → 部署到目标环境 ``` 你只需要定义流水线的各个阶段,CodePipeline 自动按顺序执行。 ### CodeBuild——构建工人 CodeBuild 负责: - 拉取源代码 - 安装依赖 - 编译代码 - 运行测试 - 生成构建产物(JAR 包、Docker 镜像等) **特点**:按构建时间付费,不用维护构建服务器。 ### CodeDeploy——部署专家 CodeDeploy 支持多种部署策略: | 策略 | 说明 | 风险 | |------|------|------| | 一次性部署 | 所有实例同时更新 | 高(全部失败就全挂) | | 滚动部署 | 分批更新,每批一部分实例 | 中(部分失败可以停止) | | 蓝绿部署 | 启动一套新环境,切换流量 | 低(随时可以切回旧环境) | | 金丝雀部署 | 先给 5% 用户用新版本,没问题再全量 | 最低 | --- ## 一个完整的 CI/CD 流程示例 ### 场景:Web 应用部署到 ECS ``` 1. 开发者推送代码到 GitHub ↓ 2. CodePipeline 检测到代码变更,触发流水线 ↓ 3. CodeBuild 阶段: - 拉取代码 - 运行单元测试 - 构建 Docker 镜像 - 推送镜像到 ECR ↓ 4. 部署到测试环境: - 更新测试环境的 ECS 服务 - 运行集成测试 - 测试通过 ✓ ↓ 5. 人工审批(可选): - 团队负责人确认可以上线 ↓ 6. 部署到生产环境: - ECS 滚动更新 - 新版本容器启动 - 健康检查通过 - 旧版本容器停止 ↓ 7. 部署完成,通知团队 ``` 整个过程从代码提交到上线,可能只需要 10-15 分钟。 --- ## 部署策略详解 ### 蓝绿部署 ``` 当前状态: 用户 → ALB → 蓝色环境(v1.0,正在服务) 绿色环境(空闲) 部署新版本: 用户 → ALB → 蓝色环境(v1.0,正在服务) 绿色环境(v2.0,部署中...) 切换流量: 用户 → ALB → 绿色环境(v2.0,开始服务) 蓝色环境(v1.0,待命,随时可以切回) 确认无误后: 销毁蓝色环境,释放资源 ``` **优点**:切换瞬间完成,回滚也是瞬间(切回旧环境)。 **缺点**:需要双倍资源(两套环境同时存在)。 ### 金丝雀部署 ``` 阶段 1:5% 流量到新版本 用户 → ALB → 95% → v1.0 → 5% → v2.0 ← 观察有没有错误 阶段 2:没问题,扩大到 25% 用户 → ALB → 75% → v1.0 → 25% → v2.0 ← 继续观察 阶段 3:全量切换 用户 → ALB → 100% → v2.0 ✓ ``` **优点**:风险最小,问题只影响少量用户。 **缺点**:部署时间较长。 --- ## 基础设施即代码(IaC) ### 问题:手动创建资源不可重复 你在控制台上点点点创建了一套环境。下次要创建一套一模一样的测试环境,你还记得每个配置项吗? ### 解决方案:用代码定义基础设施 **CloudFormation**:AWS 的 IaC 服务。用 YAML/JSON 文件描述你要创建的所有 AWS 资源。 ``` 一个 CloudFormation 模板可以定义: - 1 个 VPC + 子网 + 路由表 - 1 个 ALB - 1 个 Auto Scaling Group + 启动模板 - 1 个 RDS 数据库 - 所有的安全组和 IAM 角色 ``` **好处**: - 可重复:同一个模板可以创建多套一模一样的环境 - 可版本控制:模板放在 Git 里,变更有记录 - 可审查:基础设施变更和代码变更一样走 Code Review - 可销毁:一键删除整套环境,不留残余资源 **类比**:CloudFormation 模板就像建筑图纸。有了图纸,可以在任何地方建出一模一样的房子。 --- ## 今天的小测验 1. CI 和 CD 分别解决什么问题? 2. 蓝绿部署和金丝雀部署各自的优缺点是什么? 3. 为什么说"基础设施即代码"很重要?它解决了什么问题? 4. CodePipeline、CodeBuild、CodeDeploy 各自的职责是什么? --- ## 延伸阅读 - [CodePipeline 用户指南](https://docs.aws.amazon.com/codepipeline/latest/userguide/) - [CodeBuild 用户指南](https://docs.aws.amazon.com/codebuild/latest/userguide/) - [CodeDeploy 用户指南](https://docs.aws.amazon.com/codedeploy/latest/userguide/) - [CloudFormation 用户指南](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/) --- ## 明天预告 明天学习 Step Functions——AWS 的工作流编排服务。了解如何把多个 Lambda 函数和服务组合成复杂的业务流程,并处理错误和重试。