From 5d2fa2d6b4f947234f5fcacf1af6e75ca60dd9b0 Mon Sep 17 00:00:00 2001 From: LoveChengke Date: Mon, 5 Oct 2026 19:52:57 +0800 Subject: [PATCH] =?UTF-8?q?fix(deploy):=20=E4=BF=AE=E4=B8=A4=E5=A4=84?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=99=A8=20bug=E2=80=94=E2=80=94=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E5=9C=B0=E5=9D=80=E5=A4=9A=E4=BA=86=E4=B8=80=E6=AE=B5?= =?UTF-8?q?=20/releases=E3=80=81=E8=8F=9C=E5=8D=95=E9=80=89=204=EF=BC=88?= =?UTF-8?q?=E5=8F=AA=E4=BD=93=E6=A3=80=EF=BC=89=E4=B8=8D=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ubuntu 24.04 实机跑出来的两个问题(用户贴的输出各暴露一个): 1. **下载地址变成 .../releases/releases/download/...**(必然 404):GITHUB_RELEASES_PAGE 本身 已经以 /releases 结尾,拼接时又写了一遍。install.sh 与 classhelper 各有一份,都改用新增的 GITHUB_REPO_URL(不含 /releases);GITHUB_RELEASES_PAGE 只留给"发布页"这类展示用途。 2. **菜单里选 4)只体检,却直接开始安装**:CHECK_ONLY 的分流写在菜单**之前**,菜单里再把它置 1 已经没人看。现在把 root 检查与 tee 都挪到菜单之后,菜单选 4 与 --check 走同一条路 —— 顺带让非 root 用户也能看到菜单并选 4,不必非得记住 --check。 --- deploy/classhelper | 7 +++++-- deploy/install.sh | 27 ++++++++++++++++++++------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/deploy/classhelper b/deploy/classhelper index a1b240b..816acf5 100644 --- a/deploy/classhelper +++ b/deploy/classhelper @@ -30,7 +30,8 @@ DEFAULT_LOG_DIR="/var/log/classhelper" DEFAULT_BACKUP_DIR="/var/backups/classhelper" REPO_SLUG="LoveChengke/ClassHelper" GITHUB_API="https://api.github.com/repos/${REPO_SLUG}" -GITHUB_RELEASES_PAGE="https://github.com/${REPO_SLUG}/releases" +GITHUB_REPO_URL="https://github.com/${REPO_SLUG}" +GITHUB_RELEASES_PAGE="${GITHUB_REPO_URL}/releases" # GitHub 对没有 User-Agent 的请求直接 403 HTTP_UA="ClassHelper-Ops" CURL_OPTS=(-fsSL --max-time 20 -H "User-Agent: ${HTTP_UA}") @@ -1115,8 +1116,10 @@ resolve_download() { # $1=版本(可空) $2=url(可空);输出下载地址 if [ -n "$want" ]; then tag="v${want#v}"; else tag="$(github_latest_tag)" || true; fi [ -n "$tag" ] || return 1 ver="${tag#v}" + # 用 GITHUB_REPO_URL(不含 /releases)拼接:GITHUB_RELEASES_PAGE 已以 /releases 结尾, + # 拼错就成了 .../releases/releases/download/... 必然 404(install.sh 里踩过同一个坑)。 printf '%s/releases/download/%s/classhelper-server-linux-%s-%s.tar.gz' \ - "$GITHUB_RELEASES_PAGE" "$tag" "$(asset_arch)" "$ver" + "$GITHUB_REPO_URL" "$tag" "$(asset_arch)" "$ver" } download_to() { # $1=url $2=目标文件 diff --git a/deploy/install.sh b/deploy/install.sh index 3211bde..a8a7266 100644 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -75,7 +75,8 @@ MYSQL_PASSWORD="" # 服务端安装包(默认取 GitHub Release 上的 Linux 资产) REPO_SLUG="LoveChengke/ClassHelper" -GITHUB_RELEASES_PAGE="https://github.com/${REPO_SLUG}/releases" +GITHUB_REPO_URL="https://github.com/${REPO_SLUG}" +GITHUB_RELEASES_PAGE="${GITHUB_REPO_URL}/releases" PACKAGE_URL="" PACKAGE_SHA256="" VERSION="" @@ -532,8 +533,10 @@ resolve_package_url() { fi fi ver="${tag#v}" + # 注意这里用 GITHUB_REPO_URL 而不是 GITHUB_RELEASES_PAGE:后者本身已经以 /releases 结尾, + # 再拼一次就变成 .../releases/releases/download/... (必然 404,实测踩到)。 printf '%s/releases/download/%s/classhelper-server-linux-%s-%s.tar.gz' \ - "$GITHUB_RELEASES_PAGE" "$tag" "$(asset_arch)" "$ver" + "$GITHUB_REPO_URL" "$tag" "$(asset_arch)" "$ver" } # 下载 + 校验 + 解压;结果放进全局 STAGE_DIR(不用命令替换取,否则会把日志一起捕获) @@ -1154,12 +1157,27 @@ print_result() { main() { parse_args "$@" + # `--check` 与菜单里的"4) 只体检"是同一条路:都不需要 root、都不改动系统。 + # 菜单必须出现在 root 检查**之前** —— 否则非 root 用户连菜单都看不到,只能靠 --check。 if [ "$CHECK_ONLY" = "1" ]; then banner check_only exit $? fi + banner + detect_os + info "系统:${OS_NAME:-未知}|包管理器:${PKG:-未知}|架构:$(uname -m)" + choose_mode_interactive + + # 菜单里选了 4:到这里才分流。 + # (原来这段判断写在菜单**之前**,从菜单选 4 时 CHECK_ONLY 设了也没人看 —— 实测踩到: + # 用户选"只体检",脚本却直接开始安装。) + if [ "$CHECK_ONLY" = "1" ]; then + check_only + exit $? + fi + if [ "$(id -u)" != "0" ]; then if [ -n "$SCRIPT_PATH" ]; then die "请用 root 执行:sudo bash ${SCRIPT_PATH}(只体检不需要 root:加 --check)" @@ -1167,7 +1185,6 @@ main() { die "请用 root 执行:在刚才那条命令前面加 sudo(只体检不需要 root:末尾加 --check)" fi - banner mkdir -p "$LOG_DIR" && chmod 700 "$LOG_DIR" { printf '\n===== %s 安装开始 =====\n' "$(date '+%F %T')" @@ -1176,10 +1193,6 @@ main() { # 后续输出同时进日志(tee 不占 stdin,交互问答照常) exec > >(tee -a "$LOG_FILE") 2>&1 - detect_os - info "系统:${OS_NAME:-未知}|包管理器:${PKG:-未知}|架构:$(uname -m)" - - choose_mode_interactive collect_answers # 把最终生效的选择打出来:非交互(--yes)或问答被跳过时,这一行是唯一能看出"到底按什么装的"地方 info "本次安装:形态 ${MODE}|目录 ${INSTALL_DIR}|端口 ${PORT}|数据库 ${DB_KIND}|Node ${NODE_SOURCE}"