From 5c22daf51b368db72d6b7043b9b93085c49b232c Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Mon, 14 Sep 2026 19:24:44 +0800 Subject: [PATCH] =?UTF-8?q?fix(deploy-drift):=20=E7=BB=93=E8=AE=BA?= =?UTF-8?q?=E5=8C=BA=E9=82=A3=E8=A1=8C=E5=91=BD=E4=BB=A4=E8=B7=91=E4=B8=8D?= =?UTF-8?q?=E8=B5=B7=E6=9D=A5=EF=BC=88node=20=E2=86=92=20bash=EF=BC=89+=20?= =?UTF-8?q?=E5=86=99=E6=98=8E=E5=88=A4=E6=8D=AE=20=E2=91=A0=20=E7=9A=84?= =?UTF-8?q?=E9=87=8F=E7=BA=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 两处,都在 `deploy/check-deploy-drift.mjs`: 1. 结论区打印的修复命令是 `node deploy/redeploy-plugin.sh `, 而它是 **bash** 脚本 —— 照抄的人会拿到 `SyntaxError: Invalid or unexpected token`(脚本第 2 行 `#` 被当 JS 解析)。 这个坑的源头就是这一行:pi 在 2026-09-14 那轮部署请求里抄的就是它打印的输出, 抄错不是阅读问题,是判据自己印错了。改成 `bash …`。 2. 判据 ① 的注释写明它比的是**仓库工作区当前内容**,不是 git HEAD。 实证(同一天):`plugins/pi-mail-bridge/src/pool.mjs` 里一行未提交的 `let missingSessionCount = 0;`(模块顶层、无人读)被 17:20 那次 **从脏工作区做的**快照原样带进了生产,而判据 ① 当时报的是「逐字节一致」—— 工作区与快照确实一致,只是两者都不等于 HEAD。 判据没错,是量纲只覆盖「仓库→快照」这一跳,覆盖不到「HEAD→工作区」那一跳; 想连那一跳一起判得单独比 `git diff --stat`。 (那条死代码本身已由 pi 的补丁 A 从工作区删掉,pool.mjs 工作区已回到 HEAD 内容; 下次部署后 `current/src/pool.mjs` 里的它才消失 —— 在此之前判据 ① 会因此报一处 pool.mjs 漂移,那是"待部署",不是新问题。) --- deploy/check-deploy-drift.mjs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/deploy/check-deploy-drift.mjs b/deploy/check-deploy-drift.mjs index 9bae176..adfc624 100644 --- a/deploy/check-deploy-drift.mjs +++ b/deploy/check-deploy-drift.mjs @@ -238,7 +238,15 @@ function checkHost(spec) { if (!existsSync(repoDir)) return fail('仓库插件目录存在', repoDir), result; if (!existsSync(linkPath)) return fail('已部署(current 存在)', `未部署:${linkPath}`), result; - // ① 内容:快照 vs 仓库(四个宿主同一套) + // ① 内容:快照 vs **仓库工作区当前内容**(四个宿主同一套) + // + // ★ 比的是工作区**当前**内容,不是 git HEAD —— 仓库脏(未提交的改动)时 + // 这条判据照样会绿。实证(2026-09-14):`pool.mjs` 里有一行未提交的 + // `let missingSessionCount = 0;`(模块顶层、无人读),被 17:20 那次 + // 「从脏工作区做的」快照原样带进了生产,而这条判据当时报的是「逐字节一致」 + // —— 工作区与快照确实一致,只是两者都不等于 HEAD。判据没错,是它的**量纲** + // 只覆盖「仓库→快照」这一跳,覆盖不到「HEAD→工作区」那一跳。 + // 想连那一跳一起判,得单独比 `git diff --stat`,别指望这一条。 const d = diffTrees(collectFiles(repoDir), collectFiles(linkPath)); const { runtimeDrift, docDrift } = diffSummary(d); if (runtimeDrift === 0) { @@ -567,7 +575,7 @@ function main() { for (const c of layout) console.log(` ${c.ok ? '通过' : '失败'} ${c.name}${c.note ? ' — ' + c.note : ''}`); const stale = results.filter(r => r.stale); console.log(`\n 结论:${stale.length === 0 ? '四个宿主都在跑当前代码' : `${stale.length} 个宿主需要重新部署/重启`}`); - for (const r of stale) console.log(` ✗ ${r.host}:node deploy/redeploy-plugin.sh ${r.host}`); + for (const r of stale) console.log(` ✗ ${r.host}:bash deploy/redeploy-plugin.sh ${r.host}`); } process.exit(results.some(r => r.stale) || layoutBad.length ? 1 : 0); }