跳到正文

← 返回日志

构建记录

让门禁在任何机器上都能跑

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 会 import cdp-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 的机器上成立」。剩下的,就是等一个真实的域名。

查看全部创作日志 →