绿灯不等于上线
首推后 CI 4/4 全绿、CF 也报 Deploy successful,但远端冒烟发现线上发布的是仓库源码而非 dist/
今天做到了哪一步
把代码首推到 zjc99999/website 之后,第一次在 GitHub 托管 runner 上把整套门禁真跑了一遍。
第一次 4 个 job 里红了 1 个:audit 的「确认没有密钥被提交」。查下来不是站点漏了密钥,
而是 sk_live_ 这条规则太宽,把一篇创作日志里「提到这条正则」的正文也扫成了密钥。
更麻烦的是本地 pnpm verify:ci 当时却是全绿——不是因为干净,而是 Windows 下 git 默认
core.quotepath,中文文件名被八进制转义,existsSync 找不到就静默跳过,等于什么都没测。
一处假红、一处假绿,方向相反,病根相同:规则和执行各写了两份,谁也不保证对方在测什么。
所以没有给两边各打补丁,而是收敛成 scripts/secret-scan.mjs 一个引擎:规则收紧到
sk_live_ 后面必须跟 20 个以上字母数字(这样规则文本自己不会匹配自己,也就不需要白名单),
git ls-files -z 配 core.quotepath=false 拿真实文件名,再断言「确实扫到了文件」「没有静默跳过」
「ci.yml 引用了同一个脚本」。故意把一条真密钥探针塞进 tracked 的 README,它红了;
拿出来,它绿了。第二次 push run 43395389553 4/4 全绿。
但绿灯没把站点送上线
Cloudflare Pages 的 check-run 也是绿的:「✅ Deploy successful!」。
直到跑 deploy:smoke:remote https://website-1tq.pages.dev 才看见另一幅景象:
11 个核心页全部 404,/package.json 却返回 200,/index.html 404,RSS、JSON Feed、
sitemap、Pagefind 全 404,连 /robots.txt 都是 Cloudflare 自己的默认文案。
也就是说:平台把整个 Git 仓库根目录当静态站发布了。根因在项目没配构建命令/输出目录——
CF 的规则是「没有 build command 就把仓库根当静态资源上传,退出码 0 即成功」,
所以一个没跑过 pnpm build 的部署照样能报绿。顺带还纠正了一个推断:平台分配域是
website-1tq.pages.dev(带随机后缀),不是清单里写的 website.pages.dev,后者实测 522 不存在。
记下来的三条
- CI 全绿 ≠ 线上产物正确。 CI 只能保证
dist/造得对;平台按什么目录发布、用哪个 pnpm 版本,是另一层配置。消费端冒烟才是唯一裁判,平台按钮的绿不能当验收签字。 - 假测试往往成对出现。 一边把说明文字当密钥(假红),一边因文件名转义啥也没扫(假绿)。 与其修两个现象,不如问「这个断言到底测到了什么」——然后让它自己证明扫过文件、规则不自匹配。
- 默认值要按平台文档来,不按本机来。 CF Build image v3 默认 pnpm 10.11.1,不认
packageManager字段,要在后台显式设PNPM_VERSION=11.28.5;Node 22.23.4 恰好够 astro 用, 不用另设。这些都不是能从本机pnpm run quality里推出来的。
还没闭环的
CF 后台的 Build command / 输出目录 / PNPM_VERSION 要用户本人去配,配完重新部署,
远端冒烟才会从 FAIL 转 PASS;之后才是自定义域名 CNAME、HTTPS、发布→回滚→再发布演练、
国内与第三方实测、作者真实收到通知、5 人 3 秒测试。今天先把「绿灯不等于上线」这件事
写进演练文档和近况里,等远端冒烟真的全绿了,再回头把这句话划掉。
相关记录
- 把真实域名写进代码 · 2026/11/13