From 8072c2442dbd81dd1f021abd5d93f45284cc03f6 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Tue, 29 Sep 2026 17:25:51 +0800 Subject: [PATCH] =?UTF-8?q?docs(deploy):=20=E6=89=8B=E5=86=8C=E8=A1=A5?= =?UTF-8?q?=E3=80=8C=E6=9C=AC=E6=9C=BA=20diff=20=E6=98=AF=E5=9D=8F?= =?UTF-8?q?=E7=9A=84=E3=80=8D=E2=80=94=E2=80=94=20=E6=AF=94=E5=AF=B9?= =?UTF-8?q?=E5=88=A4=E6=8D=AE=E7=9A=84=E7=A1=AC=E5=89=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 这条已骗过两次(openai.lua、两版 release.yml),今天又骗了第三次,且这次 后果最重:它把部署脚本的比对判据整个架空成假绿灯。 补进手册 0.1 节(放在拓扑之后、各部署章节之前,因为它是所有比对的前提): - 结论:一律 /usr/bin/diff 或 cmp,不要裸 diff - 三条可自证真伪的单行命令(含 cmp 未被污染这个事实) - 为什么比「偶尔报错」危险:部署判据假绿灯 ⇒ 站点永久不再更新 - ★ 判据自检的通用写法(拿必然不同的输入验判据,不过就退出) - 同类信号表:diff 说无差异但 wc -c 说大小不同 / 报一致但线上明显是旧的 / 测必然不同的样本却报相同 - 远端 diff 健康,但嵌在 ssh "…" 里要分清本地还是远端执行 --- docs/zh/deploy-runbook.md | 44 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/docs/zh/deploy-runbook.md b/docs/zh/deploy-runbook.md index 4a2548d..f9c6fba 100644 --- a/docs/zh/deploy-runbook.md +++ b/docs/zh/deploy-runbook.md @@ -38,6 +38,49 @@ --- +### 0.1 ★★ 本机 `diff` 是坏的 —— 所有比对判据的硬前置 + +**结论:本机一律用 `/usr/bin/diff` 或 `cmp`,不要用裸 `diff`。** + +PATH 首位是 `/opt/huawei/harmonyos/ohos-sdk/linux/toolchains/diff`, +它**对任何输入都返回 0 且无输出**。用两个必然不同的小文件验证: + +```bash +printf 'A\n' > /tmp/d1; printf 'B\n' > /tmp/d2 +diff -q /tmp/d1 /tmp/d2; echo $? # ⇒ 0(错!应为 1) +/usr/bin/diff -q /tmp/d1 /tmp/d2; echo $? # ⇒ 1(对) +cmp -s /tmp/d1 /tmp/d2; echo $? # ⇒ 1(cmp 未被污染) +``` + +为什么这比“偶尔报错”危险得多:它让**部署判据变成假绿灯**。 +2026-09-29 实测:`deploy-sdk-site.sh --check` 对着两份**确实不同**的 +`index.html`(本地 `f8898cfc…` / 线上 `cc615cfa…`)报「✓ 逐字节一致」, +于是永远判定「无需部署」——站点改完再也不会被更新,而且看不出来。 +已在 `547d28d` 修掉(钉绝对路径 + 启动自检)。 + +★ 判据自检的通用做法: + +```bash +# 启动时用两个必然不同的输入验证判据真的能报差异;不通过就退出, +# 而不是继续拿一个坏判据去做决定。 +if "$DIFF" -q <(printf 'A\n') <(printf 'B\n') >/dev/null 2>&1; then + echo '判据自检失败:这个 diff 认为两份不同内容“无差异”' >&2; exit 1 +fi +``` + +同类信号(任一出现就立刻怀疑判据本身): + +| 信号 | 含义 | +| --- | --- | +| `diff` 说无差异,但 `wc -c` / `stat -c %s` 说大小不同 | 判据坏了 | +| 部署脚本报「一致」但线上内容明显是旧的 | 判据坏了 | +| 测了两个**必然不同**的样本却报「相同」 | 判据坏了 | + +远端(106 / 30)的 `diff` **是健康的**(`/usr/bin/diff`),不受影响; +但嵌在 `ssh "…"` 里的命令要分清楚是本地还是远端执行。 + +--- + ## 1. 部署 homed(本机) ### 1.1 硬前置:必须 onnxruntime 构建 @@ -118,6 +161,7 @@ curl -s -H "X-API-Key: $K" http://127.0.0.1:8080/api/v1/status | grep -oE '"comm (86811464),更掩盖了这个问题。 ⇒ 部署前的判据顺序: + 1. `/api/v1/status` 的 `commit` —— 线上在跑什么 2. `git log ..HEAD` —— 差哪些提交 3. 那些提交里**有无运行时改动**(`internal/`、`cmd/`)—— 只有它才需要部署