From 3236d3ad836bf1011a0257677433b5eb8df297ab Mon Sep 17 00:00:00 2001 From: LoveChengke Date: Sun, 11 Oct 2026 14:28:07 +0800 Subject: [PATCH] =?UTF-8?q?fix(deploy):=20install.sh=20--version=201.3.0?= =?UTF-8?q?=20=E4=B8=8B=E8=BD=BD=20404=20=E2=80=94=E2=80=94=20=E6=8B=BC?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E6=97=B6=20tag=20=E5=B0=91=E4=BA=86=20v=20?= =?UTF-8?q?=E5=89=8D=E7=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Release 的 tag 是 `v1.3.0`,而 `--version` 的用法一向不带 v(用法提示与文档都写 `--version 1.1.2`), GitHub 的 `/releases/download//` 又是**按 tag 精确匹配**的(`releases/tags/1.3.0` 直接 404), 于是 install.sh 直接把 `VERSION` 拿去拼出来的地址必然 404: [classhelper] 下载:.../releases/download/1.3.0/classhelper-server-linux-x64-1.3.0.tar.gz curl: (22) The requested URL returned error: 404 同一个功能上,`classhelper` 的 `resolve_download()` 一直是 `tag="v${want#v}"`,install.sh 漏了这句 —— 所以 `classhelper upgrade --version 1.3.0` 正常、`bash install.sh --version 1.3.0` 却 404, 两处只在 `deploy/` 内部对不齐。现在两边都归一化。 `VERSION` 本身**保持不带 v**:`tag` 是另一个局部变量,装完写进安装目录的 VERSION 文件用的仍是不带 v 的裸版本号,别把它一起改了。 实测(把 install.sh 里的 `resolve_package_url()` 原样抽出来单独跑,不手抄): | VERSION 传参 | 修复前 | 修复后 | | ------------- | --------------------------------- | ------------------------------------ | | `1.3.0` | `.../download/1.3.0/...` → 404 | `.../download/v1.3.0/...` | | `v1.3.0` | `.../download/v1.3.0/...` | `.../download/v1.3.0/...` | | 留空(latest) | `.../download/v1.3.0/...` | `.../download/v1.3.0/...` | `bash -n` 四个脚本(install.sh / classhelper / verify-linux.sh / install-linux.sh)全过。 本机 curl 到 github.com 超时(见 §7 第 1 条),所以**真正下载要走服务器实测**。 AGENTS.md §5 第 59 条补 ⑦ 记下这条约定。 --- AGENTS.md | 11 +++++++++++ deploy/install.sh | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 2e3d429..ecec305 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1099,6 +1099,17 @@ term / dashboard / database / update / permissions / clients / system`。 CentOS 7 是 2.17 —— 装上去的表现为"服务起来就退出、日志什么都没有"。安装器检测 glibc, 低于 2.28 时自动改用 unofficial-builds 的 `-glibc-217` 变体。CentOS 7 仍属尽力而为。 + ⑦ **拼下载地址时,tag 必须补 `v` 前缀 —— `--version` 的用法是不带 v 的。** + Release 的 tag 是 `v1.3.0`,而安装/升级参数一律写成 `--version 1.3.0`;GitHub 的 + `/releases/download//` 是**按 tag 精确匹配**的(`gh api .../releases/tags/1.3.0` 直接 404), + 所以中间少一步归一化就会拼出 `.../download/1.3.0/...` → **curl 22 / HTTP 404**。 + 两处拼地址的地方**必须都写** `tag="v${tag#v}"`:`classhelper` 的 `resolve_download()` 一直有这句, + 而 `install.sh` 的 `resolve_package_url()` 2026-10-11 之前是直接 `local tag="$VERSION"` —— + 于是同一个版本,`classhelper upgrade --version 1.3.0` 正常、`install.sh --version 1.3.0` 却 404, + 只在 `deploy/` 内部对不齐,光看代码很难注意到。新增拼地址的地方照抄这句,别各写一套。 + (注意:`VERSION` 本身**保持不带 v** —— `tag` 是另一个局部变量,装完写进安装目录的 VERSION 文件 + 仍是不带 v 的裸版本号,别把它一起改了。) + 两条写这类脚本时的通用坑(本仓库踩过):**`set -e` 下 `[ cond ] && 可能失败的命令` 会 在条件为假时……其实不会退出**(bash 对 `&&` 列表里非最后一条失败是豁免的),但 `A && B` 里 B 失败、以及**用 `$(函数)` 捕获输出时把日志一起捕获**(所以安装器用全局 diff --git a/deploy/install.sh b/deploy/install.sh index 8df4c20..c4f0324 100644 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -540,6 +540,12 @@ resolve_package_url() { sudo bash install.sh --package /tmp/classhelper-server-linux-x64-1.1.2.tar.gz" fi fi + # tag 一律补上 v 前缀:Release 的 tag 是 v1.3.0,而 --version 的用法是 `--version 1.3.0`(不带 v)—— + # 直接拿 VERSION 去拼就成了 .../download/1.3.0/...,GitHub 按 tag 精确匹配,必然 404 + # (2026-10-11 实测:`install.sh --version 1.3.0` 下载 404,而 `classhelper upgrade --version 1.3.0` 正常 + # —— 因为 classhelper 的 resolve_download 一直有这句,install.sh 漏了)。 + # 传 `v1.3.0`、`1.3.0`、或者不传(走 latest)三种写法都落在这里。 + tag="v${tag#v}" ver="${tag#v}" # 注意这里用 GITHUB_REPO_URL 而不是 GITHUB_RELEASES_PAGE:后者本身已经以 /releases 结尾, # 再拼一次就变成 .../releases/releases/download/... (必然 404,实测踩到)。