CONTINUOUS DELIVERY持续交付
机器把包打好、放在门口,人点一下才真的发布。适合上线成本高、要挑时间窗的场景。
CI 是质检员,拦住写坏的代码;CD 是快递员,把验过的代码送到用户面前。
// 面向团队所有人 · 没写过代码也能看懂
// 本文为公开版,具体标识已替换为占位符,账单与用量数字改为示意
问题不在于代码会坏——代码总会坏。问题在于 三天后才发现,而这三天里所有人都在这份坏代码上继续写。
// 序号跨行跳一次 = 一次交接 · 01 → 04 之间隔了三天,中间没有任何一道闸
各自本地都是好的,合到一起才坏——这就是 Integration(集成)这个词的由来。CI 要解决的就是「合起来这一刻没人验」。
不用等谁想起来跑测试。代码一推上去,GitHub 就开一台干净的机器,把项目从头装一遍、编译一遍、测一遍。下面五步是我们这边的实际配置,别的团队顺序可能不同。
// 琥珀 = 人或闸门 · 青 = 机器自动 · 流光点表示这条链路一直在跑
「持续」的意思是每次推送都跑,不是每周跑一次。它的全部价值在快——坏了几分钟内就知道,而不是三天后从一堆改动里翻。
CD 有两个都对的展开,区别只有一个:最后那一下,是人点的,还是机器自己点的。
// 菱形 = 判断点 · 两条路都叫 CD,选哪条取决于这次上线错了有多贵
机器把包打好、放在门口,人点一下才真的发布。适合上线成本高、要挑时间窗的场景。
CI 一绿直接自动上线,没有人工按钮。我们的 Vercel 走的是这条——但只有改到前端的提交才会真的触发部署(见下一章)。
从你敲下 git push,到确认线上真的变了——我们这边的这六步,哪一步断了都不算送到。
main。改到核心目录(模型调用 / 定时任务 / 数据库结构 / 登录鉴权)还要额外的人工复核
Deploy Vercel 调 Vercel API 打包(Vercel 自带的 git 监听已关掉);只动文档或后端时,这一步整个跳过
// 第 6 步不能省:前五步全绿,线上仍可能是旧版本。
绿灯只说明「某件事跑完了」,不说明「你要的那件事成了」。下面这次事故和两类绿灯,我们都真踩过。
整个 GitHub 组织的 Actions 停摆 2.5 小时,43 个任务直接启动失败,而告警一条都没发出来——监控自己也跑在 GitHub Actions 上,跟着一起被闸断了。团队排查了代码、workflow 语法、GitHub 状态页,全部正常。真因是风控自动打的账号级计费锁,而所有计费页面当时都显示一切正常。当天解锁后重跑恢复;九月至今同类拦截 0 次。
CI 只验证了你写的那些测试。测试没覆盖到的地方,它一无所知。构建成功只说明能编译,不说明逻辑对。
部署是另一件事。额度用完、计费锁、配置漏了,都会让它悄悄没跑,而 CI 那边照样是绿的。九月 35 次部署有 21 次被跳过——绝大多数是该跳过的(改的是文档或后端,前端没变)。真正的陷阱是:你以为改了前端、但路径没匹配上,这两种从外面看一模一样。
别问 CI,去问生产:请求一条这次新增的路由,看它认不认。
curl -s -o /dev/null -w '%{http_code}' https://你的域名/本次新增的路由 # 404 → 没部署上去 200 / 401 → 部署了GitHub 全球只用美元计价。国内卡付款时,是卡组织按当日汇率折成人民币扣——账单和发票本身始终是美元。
// 条长按最大值 8,640 归一 · 灰 = 每月免费额度,青 = 消耗 · 一个每 5 分钟跑一次的小脚本,一个月就超过 4 个 Free 额度 · 把用量大的仓改跑自建 runner,这部分算力不再计入 GitHub 账单,但机器本身的成本是另一笔账
| 项目 | 口径 | 值 |
|---|---|---|
| 计价币种 | GitHub 全球统一,无人民币计价 | USD |
| Linux 2 核单价 | 每个 job 单独计,不足 1 分钟按 1 分钟收 | $0.006 / min |
| 免费额度 · Free | 每月重置,仅私有仓消耗 | 2,000 min |
| 免费额度 · Team | 主力团队 org 用的是这一档 | 3,000 min |
| 公开仓 | 标准 runner 不计入额度;大规格 runner 仍计费 | 标准 runner 免费 |
| 自托管 runner | 机器自备,分钟不计入 GitHub 账单 | 机器成本另算 |
不是大项目,是每 5 分钟跑一次的小脚本——跑 1 秒也按 1 分钟收。*/5 一个月就是 8,640 分钟,远超 2,000 的免费额度;改成 */30 就是 1,440 分钟,稳稳在内。