fix(deploy): 修两处安装器 bug——下载地址多了一段 /releases、菜单选 4(只体检)不生效

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。
This commit is contained in:
LoveChengke committed 2026-10-05 19:52:57 +08:00
1 parent 2be8d30376
commit 5d2fa2d6b4
2 files changed
+25 -9

No files matched your search

+5 -2
View File
@@ -30,7 +30,8 @@ DEFAULT_LOG_DIR="/var/log/classhelper"
DEFAULT_BACKUP_DIR="/var/backups/classhelper" DEFAULT_BACKUP_DIR="/var/backups/classhelper"
REPO_SLUG="LoveChengke/ClassHelper" REPO_SLUG="LoveChengke/ClassHelper"
GITHUB_API="https://api.github.com/repos/${REPO_SLUG}" 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 # GitHub 对没有 User-Agent 的请求直接 403
HTTP_UA="ClassHelper-Ops" HTTP_UA="ClassHelper-Ops"
CURL_OPTS=(-fsSL --max-time 20 -H "User-Agent: ${HTTP_UA}") 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 if [ -n "$want" ]; then tag="v${want#v}"; else tag="$(github_latest_tag)" || true; fi
[ -n "$tag" ] || return 1 [ -n "$tag" ] || return 1
ver="${tag#v}" 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' \ 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=目标文件 download_to() { # $1=url $2=目标文件
+20 -7
View File
@@ -75,7 +75,8 @@ MYSQL_PASSWORD=""
# 服务端安装包(默认取 GitHub Release 上的 Linux 资产) # 服务端安装包(默认取 GitHub Release 上的 Linux 资产)
REPO_SLUG="LoveChengke/ClassHelper" 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_URL=""
PACKAGE_SHA256="" PACKAGE_SHA256=""
VERSION="" VERSION=""
@@ -532,8 +533,10 @@ resolve_package_url() {
fi fi
fi fi
ver="${tag#v}" 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' \ 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(不用命令替换取,否则会把日志一起捕获) # 下载 + 校验 + 解压;结果放进全局 STAGE_DIR(不用命令替换取,否则会把日志一起捕获)
@@ -1154,12 +1157,27 @@ print_result() {
main() { main() {
parse_args "$@" parse_args "$@"
# `--check` 与菜单里的"4) 只体检"是同一条路:都不需要 root、都不改动系统。
# 菜单必须出现在 root 检查**之前** —— 否则非 root 用户连菜单都看不到,只能靠 --check。
if [ "$CHECK_ONLY" = "1" ]; then if [ "$CHECK_ONLY" = "1" ]; then
banner banner
check_only check_only
exit $? exit $?
fi 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 [ "$(id -u)" != "0" ]; then
if [ -n "$SCRIPT_PATH" ]; then if [ -n "$SCRIPT_PATH" ]; then
die "请用 root 执行:sudo bash ${SCRIPT_PATH}(只体检不需要 root:加 --check)" die "请用 root 执行:sudo bash ${SCRIPT_PATH}(只体检不需要 root:加 --check)"
@@ -1167,7 +1185,6 @@ main() {
die "请用 root 执行:在刚才那条命令前面加 sudo(只体检不需要 root:末尾加 --check)" die "请用 root 执行:在刚才那条命令前面加 sudo(只体检不需要 root:末尾加 --check)"
fi fi
banner
mkdir -p "$LOG_DIR" && chmod 700 "$LOG_DIR" mkdir -p "$LOG_DIR" && chmod 700 "$LOG_DIR"
{ {
printf '\n===== %s 安装开始 =====\n' "$(date '+%F %T')" printf '\n===== %s 安装开始 =====\n' "$(date '+%F %T')"
@@ -1176,10 +1193,6 @@ main() {
# 后续输出同时进日志(tee 不占 stdin,交互问答照常) # 后续输出同时进日志(tee 不占 stdin,交互问答照常)
exec > >(tee -a "$LOG_FILE") 2>&1 exec > >(tee -a "$LOG_FILE") 2>&1
detect_os
info "系统:${OS_NAME:-未知}|包管理器:${PKG:-未知}|架构:$(uname -m)"
choose_mode_interactive
collect_answers collect_answers
# 把最终生效的选择打出来:非交互(--yes)或问答被跳过时,这一行是唯一能看出"到底按什么装的"地方 # 把最终生效的选择打出来:非交互(--yes)或问答被跳过时,这一行是唯一能看出"到底按什么装的"地方
info "本次安装:形态 ${MODE}|目录 ${INSTALL_DIR}|端口 ${PORT}|数据库 ${DB_KIND}|Node ${NODE_SOURCE}" info "本次安装:形态 ${MODE}|目录 ${INSTALL_DIR}|端口 ${PORT}|数据库 ${DB_KIND}|Node ${NODE_SOURCE}"