📄 本篇摘要
CI(持续集成):每人每天多次把代码合入主干,每次合入自动构建+自动测试——问题当天暴露。CD(持续交付/部署):通过测试的代码自动打包,随时可发布(交付)或自动发布(部署)。CI/CD 是 5-9 DevOps 的发动机。
📝 关系
上一节:软件生命周期与 DevOps | 下一节:重构
一、为什么需要 CI:集成之痛
没有 CI 的团队各自开发一个月,合并日就是【集成地狱】:冲突成山、接口对不上、谁也不知道是谁改坏的。CI 的解法=缩短合入周期+自动化把关:
提交代码 -> 自动拉取 -> 自动构建 -> 自动跑测试 -> 全绿则合入 / 变红则当场拦下
每次合入只带少量变化,出错范围极小、回滚极快。主干保持随时可用是 CI 的第一纪律。
二、CD 的两级:交付与部署
- 持续交付(Continuous Delivery):每次通过测试都产出一个【随时可上线的版本】,发布按钮留给人按(何时发布、发不发,业务说了算)。
- 持续部署(Continuous Deployment):更彻底——测试全绿自动发布到生产环境,无人值守。
区别就一句话:按钮在不在人手里。教材同时提醒:CD 的前提是测试可信——测试不可靠,自动化部署就是在自动散播事故。
三、流水线(pipeline)长什么样
一条典型流水线的岗位(顺序执行,任何一岗挂掉即终止):
- 静态检查(5-8 的 linter/类型检查);
- 自动构建(5-14);
- 单元测试(5-3,最快最便宜);
- 集成/端到端测试;
- 打包成制品(版本号、可追溯);
- 部署到预发布环境 → 生产。
常见平台:GitHub Actions、GitLab CI、Jenkins。写流水线=写一个 yaml 文件:声明【什么时候触发、跑哪些步骤】。
四、动手 Demo:模拟一条迷你流水线
def pipeline(commit):
"""迷你 CI 流水线:任一步骤失败即拦截"""
steps = []
def step(name, ok, detail=""):
steps.append((name, "OK" if ok else "FAIL", detail))
if not ok:
print("流水线终止于:", name, "->", detail)
return ok
# 1 静态检查 2 构建 3 测试 4 部署
if not step("静态检查", commit["lint"]):
return "BLOCKED"
if not step("构建", commit["build"]):
return "BLOCKED"
if not step("单元测试", commit["tests"], f"通过率 {commit['tests']}"):
return "BLOCKED"
step("部署", True, "已发布到生产")
for name, status, detail in steps:
print(f"{name}: {status} {detail}")
return "RELEASED"
good = {"lint": True, "build": True, "tests": True}
bad = {"lint": True, "build": True, "tests": False}
print(pipeline(good))
print("---")
print(pipeline(bad))
沙箱实跑输出:
静态检查: OK
构建: OK
单元测试: OK 通过率 True
部署: OK 已发布到生产
RELEASED
---
流水线终止于: 单元测试 -> 通过率 False
BLOCKED
看到什么算成功:好提交一路 RELEASED;坏提交在测试岗被拦、BLOCKED。
读结果:流水线的本质是一串自动化的质量关卡——失败的提交永远到不了生产。5-8 的静态分析、5-3 的测试、5-14 的构建在这里全部上岗。
五、30 秒实验
把 bad 提交的 tests 改回 True 再提交一次——它顺利 RELEASED。然后把 lint 改成 False——流水线更早拦住它(静态检查是第一道岗,问题发现得越早修复越便宜)。
六、常见误区
| 误区 | 真相 |
|---|---|
| CI=装个 Jenkins | CI 是纪律(每天合入+主干常绿);工具只是载体 |
| 测试红了先跳过再补 | 跳过一次就有第二次;红灯必须当天修——主干常绿是底线 |
| 发布频率高=风险高 | 反了:小步发布每次变化少、回滚快,风险反而更低 |
自测三问(点击展开)
1. **CI 解决什么问题?** 答:集成地狱——缩短合入周期、每次合入自动构建测试,问题当天暴露。 2. **持续交付和持续部署的区别?** 答:交付的发布按钮在人手里,部署全自动化无人值守。 3. **流水线第一道岗为什么是静态检查?** 答:最快最便宜;格式与低级错误在测试跑起来之前就拦下。- ☐ 5-10 学习完成
相关笔记
- 构建与 make —— 流水线第 2 岗的专业版
- 测试驱动开发与 XP —— 测试可信从哪来
- ⌨️ 编程原理 · 索引 —— 全课路线图