--- id: pre-deploy-checklist type: checklist group: B status: published version: 1 updated: 2026-11-06 token_estimate: 1461 --- # 如何做发布前的检查 > **用途**:在按下发布之前,逐项确认该准备的都准备了。**这是一道闸门,不是一份流程。** > > **覆盖**:站点发布、文件上线、批量部署之前的自查。 > > **产出**:通过,或者「卡在第几项」。没有第三种结果。 > > 拿到就能跑:逐项过,**任一项不过就停**。带着一项没过发布出去,出问题时你会同时处理两件事。 --- ## 触发的变异问法 - 「可以发布了吗」 - 「上线前要检查什么」 - 「推之前还有什么要注意的」 - 「这次改动安不安全」 - 「能不能直接推」 - 「发布前清单有没有」 - 「怎么避免上线出事故」 - 「紧急修复也要走这套吗」 --- ## 什么时候不要用这份文件 - **已经在发布过程中** —— 这是闸门,闸门在开门前用。 - **改的是服务器配置或数据** —— 那不是文件发布,检查项不同。 - **只是想看看线上长什么样** —— 那是查看,不是发布。 - **发布内容还没定稿** —— 先定稿,再检查。检查不负责发现「还没想好」。 --- ## 检查项 ### 一 · 改动范围清不清楚 判据:能列出这次要动的**每一个文件**,以及每个文件为什么动。 不过怎么办:停下,先列清单。说不出「为什么动」的文件,不要推——它多半是顺手带上的。 ### 二 · 有没有回退点 判据:改动前的线上文件已备份,且**备份件 md5 等于改动前那一版**。 不过怎么办:先建回退点,再继续。判据是内容不是时间——按时间挑「最新备份」,可能挑到的正是被覆盖过的新内容。 ### 三 · 有没有别的任务在跑 判据:没有相关进程、没有锁文件、目标目录最近没有其它写入。 不过怎么办:等它结束再推。两边同时写同一个索引,最后谁赢取决于毫秒,输的一方**静默消失**,而且事后极难发现。 ### 四 · 线上当前是什么版本 判据:取回来的 md5 与你预期的一致(线上确实还是旧版)。 不过怎么办:查清是谁推过、推了什么。线上已经是新版还照推一遍,可能把别人的改动盖掉。 ### 五 · 有没有顺带带上的东西 判据:待推清单里没有临时文件、调试代码、密钥、本地配置、日志。 不过怎么办:逐个剔除。⛔ **不要用通配符推**——别人的临时文件可能就在同一个目录里,一起被带走。 ### 六 · 派生件会不会受影响 判据:清楚这次改动会让哪些索引、清单、缓存需要重建。 不过怎么办:先想清楚再推。推完才发现索引是旧的,等于「内容在,但找不到」。 ### 七 · 回退路径走过没有 判据:能说清怎么退、退哪些文件、退完怎么验证。 不过怎么办:没走过就先写下来。紧急时没有人会现场想这个——那时只会更慌。 ### 八 · 推完怎么知道成功 判据:有明确的四项验证——状态码、字节数、md5、关键文字。 不过怎么办:没有验证方法,就不算可发布。**「推上去了」和「生效了」是两件事。** --- ## 输出规范 ### 人读 ``` 检查结果:通过 / 不通过(卡在第 N 项) 各项:1 ✓ 2 ✓ 3 ✗(有任务在跑,等到 15:40)4 … 未覆盖:<这次检查没管什么,例如「没查内容质量」> ``` ### 机器读 ``` verdict: pass | fail blocked_at: <项编号>|null items: [{n, name, ok: true|false, evidence}] note: <未覆盖范围> ``` `blocked_at` 有值时不发布,**不要因为「就差一项」而放行**。 ### 一句话版 `八项全过,可发。` 或 `卡在第三项:有任务在跑,等它结束。` --- ## 常见错误 - **把闸门当流程** —— 逐项检查不是「按顺序做八件事」,是「八个问题各自回答是或否」。 - **「就差一项」就放行** —— 那一项往往正是出事的那一项。 - **用通配符推** —— 临时文件、别人的中间产物会被一起带上线。 - **不查线上当前版本** —— 有人先推过了,你再推一遍会覆盖。 - **回退点按时间挑** —— 挑到的可能是新内容,回退时等于没退。 - **只看有没有备份,不核 md5** —— 有一份文件在,不等于它是改动前那一版。 - **推完就说发布完成** —— 没从线上取回来验证,那只是「我按了按钮」。 --- ## 最后核对 2026-11-06。检查项与环境无关;八项判据通用。与所执行系统的既定标准冲突时,以那个系统的标准为准。