aws-doc/课程/第四阶段-应用架构/第28天-CICD持续集成部署.md
2026-05-08 10:24:39 +08:00

262 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 第28天CI/CD——代码从提交到上线的自动化流水线
## 今天你将学到什么
今天学习 CI/CD持续集成/持续部署)——让代码从开发者提交到最终上线的整个过程自动化。不再需要手动打包、手动上传、手动重启服务器。
---
## 为什么需要 CI/CD
### 没有 CI/CD 的世界
传统的部署流程:
1. 开发者写完代码,在本地测试通过
2. 把代码打包成压缩文件,通过 FTP 上传到服务器
3. SSH 登录服务器,停止旧服务
4. 解压新代码,安装依赖
5. 启动新服务,祈祷不出问题
6. 出问题了?手动回滚到上一个版本
**问题**
- 容易出错(手动操作步骤多)
- 速度慢(一次部署可能要半小时)
- 不敢频繁部署(怕出问题)
- 回滚困难(上一个版本在哪?)
- 不同人部署方式不一样("你是怎么部署的?"
### 有 CI/CD 的世界
```
开发者提交代码 → 自动测试 → 自动构建 → 自动部署 → 上线完成
```
整个过程自动化、可重复、可追溯。出问题一键回滚。
**类比**CI/CD 就像工厂的自动化生产线。原材料(代码)放上去,经过一道道自动化工序(测试、构建、部署),最终产出成品(上线的应用)。不需要工人在每个环节手动操作。
---
## CI 和 CD 分别是什么
### CIContinuous Integration持续集成
**核心思想**:开发者频繁地把代码合并到主分支,每次合并都自动运行测试。
```
开发者提交代码
自动拉取代码
自动运行测试(单元测试、集成测试)
测试通过?
├── 是 → 代码合并成功 ✓
└── 否 → 通知开发者修复 ✗
```
**好处**
- 问题早发现(提交后几分钟就知道有没有 bug
- 避免"集成地狱"(多人同时开发,最后合并时冲突一堆)
### CDContinuous 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,待命,随时可以切回)
确认无误后:
销毁蓝色环境,释放资源
```
**优点**:切换瞬间完成,回滚也是瞬间(切回旧环境)。
**缺点**:需要双倍资源(两套环境同时存在)。
### 金丝雀部署
```
阶段 15% 流量到新版本
用户 → 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 函数和服务组合成复杂的业务流程,并处理错误和重试。