fix(deploy): 故障通知脚本的安装原来在 if 分支里(--skip-web 就不装)+ 判据 ③ 只验"在不在"

pi 读代码抓到的两处,实测确认:

1. `redeploy-gateway.sh` 的 `install … service-failure-notify.mjs` 夹在
   `if [ "$SYNC_WEB" = 1 ] && [ -d …/dist/assets ]` 里(在 `[ OK ] 前端产物比源码新`
   之后、`else` 之前)⇒ **`--skip-web`、或 `dist/assets` 不存在时运行时脚本根本不装**。
   它跟前端产物没有任何关系,只是恰好被写进了同一支。后果:改了仓库里的通知脚本、
   用 `--skip-web` 部署 ⇒ **生产还是旧的那份**。
   已移出 if/else(并加 `install -d` / 安装失败的判失败 + exit 2)。

2. 判据 ③ 原先只判 `<isFile> && 有执行位`,不判**是哪一份** ⇒ 上一条的后果全绿。
   现在比内容(与仓库 `deploy/service-failure-notify.mjs` 逐字节),
   读不到仓库那份时**报"比不了"并判红**,不许当成"一致"。
   —— 判据 ② 对 unit 本来就是比内容的,③ 该同形。

自检新增一条:★通知脚本内容与仓库不一致 ⇒ 必须红。
(探针第一版按**文件名**判两侧,而两条路径的文件名相同
(`deploy/service-failure-notify.mjs` vs `/opt/agentmail/bin/service-failure-notify.mjs`)
⇒ 两边返回同一个串、探针自己没分辨力。改成按哪一侧区分。)

现状实测:仓库与装机两份 sha256 相同(496 行),所以这是**盲区而非事故** ——
pi 的措辞准确。自检 28 条全过;实跑 ③ 报"内容与仓库一致"。
This commit is contained in:
2026-09-14 20:23:26 +08:00
parent 3b5c51c41e
commit af42a08fbf
2 changed files with 56 additions and 2 deletions

View File

@ -100,13 +100,29 @@ if [ -d "$REPO/client/electron/src" ] && [ -d "$REPO/client/electron/dist" ]; th
fi
echo " [ OK ] 前端产物比源码新"
fi
install -d /opt/agentmail/bin
install -m 0755 "$REPO/deploy/service-failure-notify.mjs" /opt/agentmail/bin/service-failure-notify.mjs
else
say "1. 跳过前端同步"
[ "$SYNC_WEB" = 0 ] && ok "--skip-web" || warn "client/electron/dist 不存在,先跑 cd client/electron && npm run build"
fi
# 运行时脚本必须装在安装根下 —— 单元/drop-in 里引用的是
# /opt/agentmail/bin/service-failure-notify.mjs,不是仓库路径。
# 漏了这一步,故障通知会在"仓库被挪走/改名"时静默失效(2026-09-14 修的就是这个)。
#
# ★ 这一段**必须在 if/else 之外**(pi 评审 2026-09-14 抓到,实测确认):
# 它原先夹在 `if SYNC_WEB…` 分支里(在 `echo " [ OK ] 前端产物比源码新"` 之后、
# `else` 之前),于是 `--skip-web`、或 `client/electron/dist/assets` 不存在时,
# **运行时脚本根本不装** —— 而它跟前端产物没有任何关系,只是恰好被写进了同一支。
# 后果是"改了仓库里的通知脚本、用 --skip-web 部署 ⇒ 生产还是旧的那份",
# 而判据 ③ 只判"在不在、有没有执行位",不判**是哪一份** ⇒ 全绿。
# (已把 ③ 一并改成比内容。)
install -d /opt/agentmail/bin || { bad "建不了 /opt/agentmail/bin"; exit 2; }
if ! install -m 0755 "$REPO/deploy/service-failure-notify.mjs" /opt/agentmail/bin/service-failure-notify.mjs; then
bad "装不了故障通知脚本"
exit 2
fi
ok "故障通知脚本已装到 /opt/agentmail/bin/"
# ---------------------------------------------------------------- 2 静态检查与测试
say "2. 构建前检查"
if [ "$DRY_RUN" = 1 ]; then