From 7a65b270bb4792f545fee4a71b3fbd3fafb9db0e Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Fri, 25 Sep 2026 06:16:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(deploy)!:=20`--dry-run`=20=E4=BC=9A?= =?UTF-8?q?=E7=9C=9F=E7=9A=84=E5=86=99=E5=85=A5=E5=AE=89=E8=A3=85=E6=A0=B9?= =?UTF-8?q?=EF=BC=88=E5=BB=BA=20bin/=20+=20=E8=A3=85=2021KB=20=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 文件头把 `--dry-run` 定义为"只打印将执行的动作",但第 1 节那两条 `install` **无守卫**,于是 dry-run 真的落地: AGENTMAIL_PREFIX=/tmp/fp2 bash deploy/redeploy-gateway.sh --dry-run ⇒ /tmp/fp2/bin/service-failure-notify.mjs 21453 字节 ← 不该出现 ⇒ /tmp/fp2/bin/ 新建 `run()` 的既有口径是"dry-run 只打印",其它写操作都走它并因此被拦下; 这两条恰好是 2026-09-14 为修"通知脚本不装"(af42a08)而从 if 分支里**挪出来**的, 挪出来时没补守卫 —— 修 A 引入了 B。 同节 1b(am-sandbox)也一样:dry-run 会**真跑一次 go build + 19 项内核判据** 并 install。一并包进 DRY_RUN 分支。 ## 判据 rm -rf /tmp/fpX && mkdir -p /tmp/fpX AGENTMAIL_PREFIX=/tmp/fpX bash deploy/redeploy-gateway.sh --dry-run 修前:残留 bin/ + bin/service-failure-notify.mjs(21453B) + .deploy.lock 修后:残留 .deploy.lock(0 字节) ← flock 载体,非"落地" `bash -n` 通过;dry-run rc=0。 ⚠️ 这与本仓"部署要一次做对"直接相关:`--dry-run` 是上线前的预览动作, 它若自己会写目标目录,就等于**在预览阶段动了生产**,而输出看起来完全正常。 --- deploy/redeploy-gateway.sh | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/deploy/redeploy-gateway.sh b/deploy/redeploy-gateway.sh index 93f8a9d..8a618c0 100755 --- a/deploy/redeploy-gateway.sh +++ b/deploy/redeploy-gateway.sh @@ -163,12 +163,22 @@ fi # 后果是"改了仓库里的通知脚本、用 --skip-web 部署 ⇒ 生产还是旧的那份", # 而判据 ③ 只判"在不在、有没有执行位",不判**是哪一份** ⇒ 全绿。 # (已把 ③ 一并改成比内容。) -install -d "$PREFIX/bin" || { bad "建不了 $PREFIX/bin"; exit 2; } -if ! install -m 0755 "$REPO/deploy/service-failure-notify.mjs" "$PREFIX/bin/service-failure-notify.mjs"; then +# ★ `--dry-run` 的语义是"只打印将执行的动作"(见文件头用法),但下面两条 `install` +# 原先**无守卫**:`--dry-run` 会真的建目录、真的把一个 21KB 脚本写进安装根。 +# 实测(AGENTMAIL_PREFIX=/tmp/fp2 bash deploy/redeploy-gateway.sh --dry-run): +# /tmp/fp2/bin/service-failure-notify.mjs 21453 字节 ← 不该出现的文件 +# 这与 `run()` 的既有口径也不一致(其它写操作都走 run 并被 DRY_RUN 拦下)。 +# ⇒ 用 run() 包住;`--dry-run` 只剩打印。 +run "install -d '$PREFIX/bin'" || { bad "建不了 $PREFIX/bin"; exit 2; } +if [ "$DRY_RUN" = 1 ]; then + printf ' [dry-run] install -m 0755 %s %s\n' \ + "$REPO/deploy/service-failure-notify.mjs" "$PREFIX/bin/service-failure-notify.mjs" +elif ! install -m 0755 "$REPO/deploy/service-failure-notify.mjs" "$PREFIX/bin/service-failure-notify.mjs"; then bad "装不了故障通知脚本" exit 2 +else + ok "故障通知脚本已装到 /opt/agentmail/bin/" fi -ok "故障通知脚本已装到 /opt/agentmail/bin/" # 边界工具 am-sandbox(Landlock)—— 只有**本机真的能建立边界**时才装。 # @@ -180,6 +190,12 @@ ok "故障通知脚本已装到 /opt/agentmail/bin/" # 不把判据失败当致命错误:它可能只是内核老 —— 那种机器仍然可以部署网关, # 只是沙箱接线会在运行时 fail closed(那一步自己会叫)。 say "1b. 边界工具(Landlock 沙箱)" +if [ "$DRY_RUN" = 1 ]; then + # 同 1. 的理由:`--dry-run` 不该真的构建、更不该真的 install。 + # 这里原来会**真跑一次 go build + 19 项内核判据**(数秒)并写入 $PREFIX/bin。 + printf ' [dry-run] go build -o %s ./cmd/am-sandbox && check-sandbox.sh && install -m 0755 → %s/bin/am-sandbox\n' \ + "/tmp/am-sandbox-build-$TS" "$PREFIX" +else SANDBOX_STAGE="/tmp/am-sandbox-build-$TS" rm -f "$SANDBOX_STAGE" if ( cd "$REPO/server" && go build -trimpath -o "$SANDBOX_STAGE" ./cmd/am-sandbox ); then @@ -193,6 +209,7 @@ else warn "am-sandbox 构建失败(不影响网关本身)" fi rm -f "$SANDBOX_STAGE" +fi # ---------------------------------------------------------------- 2 静态检查与测试 say "2. 构建前检查"