6Software Engineering at Google

持续集成

CI/CD

持续集成发布流程版本管理回滚策略

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第6章:持续集成(Continuous Integration)

一、导读

1.1 本章学习目标

第6章讲解 CI/CD——持续集成和持续交付的实践。

本章的核心学习目标包括:

  • 理解 CI/CD 的核心原则
  • 掌握发布流程的设计
  • 学会管理版本和回滚

1.2 为什么本章如此重要

CI/CD 是软件交付的命脉。没有 CI/CD,发布就是痛苦的;有了 CI/CD,发布就是日常的。

1.3 核心问题引导

CI/CD 的核心原则是什么?

如何设计安全的发布流程?

版本管理有什么最佳实践?

回滚策略应该如何设计?


二、核心概念详解

2.1 CI/CD 原则

持续集成(CI):
- 频繁合并(每天多次)
- 自动化构建和测试
- 快速反馈(< 10 分钟)
- 主分支始终可发布

持续交付(CD):
- 自动化部署到预发布
- 手动触发生产部署
- 一键部署能力
- 可回滚

持续部署:
- 自动化部署到生产
- 每次通过测试的代码都部署
- 需要强大的监控和回滚

2.2 发布流程

Google 的发布流程:

1. 代码提交
   → 自动测试
   → 代码审查
   → 合并到主分支

2. 发布候选
   → 从主分支创建发布分支
   → 运行完整测试套件
   → 生成发布候选版本

3. 金丝雀发布
   → 部署到 1% 的流量
   → 监控错误率和性能
   → 持续 1-24 小时

4. 逐步推广
   → 1% → 5% → 25% → 100%
   → 每步监控指标
   → 问题自动回滚

5. 完全发布
   → 100% 流量
   → 持续监控
   → 旧版本保留用于回滚

2.3 版本管理

版本策略:

1. 语义化版本(SemVer)
   - MAJOR.MINOR.PATCH
   - 不兼容变更 → MAJOR
   - 新功能 → MINOR
   - Bug 修复 → PATCH

2. 日历版本
   - Ubuntu: 22.04(2022年4月)
   - 适合定期发布

3. 提交哈希
   - 每次构建唯一标识
   - 适合持续部署

Google 的版本策略:
- 内部使用提交哈希
- 外部 API 使用语义化版本
- 服务使用日历版本

2.4 回滚策略

回滚原则:

1. 快速回滚
   - 回滚应该比修复更快
   - 一键回滚能力

2. 安全回滚
   - 数据库变更需要向前兼容
   - 回滚不应该丢失数据

3. 回滚测试
   - 定期测试回滚流程
   - 确保回滚可用

回滚类型:
- 代码回滚:部署旧版本
- 配置回滚:恢复旧配置
- 数据回滚:恢复旧数据(困难)

三、实战案例

3.1 案例一:CI/CD 管道配置

yaml
# .github/workflows/ci.yml
name: CI/CD

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: make test
      - run: make lint

  deploy-staging:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - run: make deploy-staging

  canary:
    needs: deploy-staging
    runs-on: ubuntu-latest
    steps:
      - run: make deploy-canary
      - run: sleep 300    # 监控 5 分钟
      - run: make check-canary

  promote:
    needs: canary
    runs-on: ubuntu-latest
    steps:
      - run: make deploy-production

四、本章小结

CI/CD 原则:频繁合并、自动化、快速反馈。

发布流程:金丝雀 → 逐步推广 → 完全发布。

版本管理:SemVer、日历版本、提交哈希。

回滚策略:快速、安全、可测试。


五、思考与练习

你的团队的发布流程是什么样的?如何改进?

如何设计一个安全的金丝雀发布流程?

回滚时如何处理数据库变更?


6/8持续集成
0%