让门禁在任何机器上都能跑
M7 准备把写死本机路径的 CI 改成标准 GitHub Actions,并把部署回滚变成可签字清单
一条自己骗自己的 CI
M6 收尾时我列了四项诚实留白,其中最刺眼的是这条:.github/workflows/ci.yml
里写着 NODE: D:\Ai\dsh-data\...\node.exe、PNPM: ...\pnpm.mjs、
CHROME_PATH: C:\Program Files\Google\Chrome\Application\chrome.exe,注释还一本正经地说
「Windows runner 因为本机 Chrome 和 DSH bundled Node 都在这里」。
这些路径只在这台开发机上存在。GitHub 托管 runner 上既没有 D:\Ai\dsh-data,
也没有 C:\Program Files\Google\Chrome;& $env:NODE $env:PNPM ... 的 PowerShell 写法
更是在 Linux 上直接不存在。本地两条链全绿、23 项 CI 自检全绿,但那检查的是
「脚本链没断」,不是「这份 workflow 真的能在远端跑起来」。全绿 ≠ 真绿,
和 M3 那次 reference() 探针是同一类问题,只是这次骗的是部署而不是证据链。
这轮做了什么
用户选了「先做不依赖账号的准备」,所以我没有碰任何域名或平台账号,只修工程:
- 把 16 处 Windows 硬编码 Chrome 收敛成
scripts/find-chrome.mjs一个探测器: 显式CHROME_PATH/PW_CHROME覆盖 → 三平台常见绝对路径 → PATH 扫描。 关键是惰性:serve.mjs会 importcdp-harness.mjs却从不启动浏览器, 顶层抛错会连本地预览都起不来。 .npmrc里storeDir=D:\.pnpm-store删掉。Linux 上这会被当成一个字面目录名; pnpm v11 自己会选同卷 store,真要固定就用环境变量或--store-dir,不写进仓库。- ci.yml 整篇重写:
ubuntu-latest+pnpm/action-setup@v4+actions/setup-node@v4, browser job 用node scripts/find-chrome.mjs把探测结果写进$GITHUB_ENV。 部署 job 刻意不加——没有账号时把它塞进 CI 只会制造第二种假绿。 - 新增
docs/部署与回滚演练.md和scripts/deploy-smoke.mjs: 本地托管dist/验 11 页 / feed / sitemap / Pagefind / 真 CSP 头, 远端模式对线上 URL 跑同一套消费端检查,发布→回滚→再发布有签字表。
又踩到两次「假测试」
verify-ci.mjs 的密钥 hygiene 检查突然红了:M6 把 ci.yml 和脚本自身提交进仓库后,
它们自己就含有 sk_live_|AKIA... 那条检测正则,被自己扫中。这不是站点有密钥,
是检测器照到了镜子。修法是把两个检测器文件列入白名单、改检查项名,
ci.yml 的 audit job 同步排除。
另一次是 YAML 自检:想用 pwsh -c/node -e 内联解析,分别被引号吞掉、
require('yaml') 在 pnpm 严格隔离下不可解析、Python 没有 yaml 模块。最后还是写独立
.mjs 引 node_modules/.pnpm/[email protected] 才通过。「复杂 JS 一律独立 .mjs」
这条纪律,这轮又替我省了一次自我怀疑。
仍然没有做的事
- 没有真部署,没有 GitHub Actions 托管 runner 首跑——这两件都等 ⑤域名 / ⑥联系方式 / ⑧远端仓库 / ⑨平台账号。
- 没有验证表单外部送达、DNS 邮件记录、国内可访问性。
deploy-smoke在远端模式里 连 CSP 响应头都只记录不判失败(不同平台对_headers的映射不一样), 因为这些必须真人按演练文档核对,脚本不冒充。
M6 把手工验证变成一条命令;M7 准备则把那条命令从「只在我这台机器上成立」 搬到了「任何装了 Node 24 和 Chrome 的机器上成立」。剩下的,就是等一个真实的域名。
相关记录
- 把手工验证变成一条命令 · 2026/11/12