172 lines
5.5 KiB
Bash
172 lines
5.5 KiB
Bash
#!/usr/bin/env bash
|
||
#
|
||
# 本地测试自动更新流程
|
||
#
|
||
# 步骤:
|
||
# 1. 打包当前版本作为「旧版」客户端
|
||
# 2. 临时 bump 到高版本,打包作为「新版」更新源
|
||
# 3. 用 HTTP 服务托管新版产物
|
||
# 4. 启动旧版客户端,指向本地更新源
|
||
#
|
||
# 用法:
|
||
# bash scripts/tools/test-update.sh
|
||
#
|
||
# 前置条件:
|
||
# - npm install 已完成
|
||
# - npx serve 可用(或全局安装 serve)
|
||
#
|
||
|
||
set -euo pipefail
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||
cd "$PROJECT_DIR"
|
||
|
||
# ---------- 配置 ----------
|
||
OLD_VERSION=$(node -p "require('./package.json').version")
|
||
NEW_VERSION="99.0.0" # 足够高,保证触发更新
|
||
SERVE_PORT=8080
|
||
|
||
echo "========================================="
|
||
echo " 本地更新测试"
|
||
echo "========================================="
|
||
echo " 当前版本 (旧版): $OLD_VERSION"
|
||
echo " 模拟版本 (新版): $NEW_VERSION"
|
||
echo " 更新源端口: $SERVE_PORT"
|
||
echo "========================================="
|
||
echo ""
|
||
|
||
# ---------- Step 1: 打包旧版 ----------
|
||
echo "[1/4] 打包旧版 v${OLD_VERSION} ..."
|
||
OLD_RELEASE_DIR="$PROJECT_DIR/release/$OLD_VERSION"
|
||
if [ -d "$OLD_RELEASE_DIR" ] && ls "$OLD_RELEASE_DIR"/*.dmg "$OLD_RELEASE_DIR"/*.exe "$OLD_RELEASE_DIR"/*.AppImage 2>/dev/null | head -1 > /dev/null; then
|
||
echo " -> 已存在 $OLD_RELEASE_DIR,跳过打包"
|
||
else
|
||
npm run dist:unsigned:local
|
||
fi
|
||
echo ""
|
||
|
||
# ---------- Step 2: 临时 bump 版本,打包新版 ----------
|
||
echo "[2/4] 打包新版 v${NEW_VERSION} ..."
|
||
NEW_RELEASE_DIR="$PROJECT_DIR/release/$NEW_VERSION"
|
||
if [ -d "$NEW_RELEASE_DIR" ] && ls "$NEW_RELEASE_DIR"/latest*.yml 2>/dev/null | head -1 > /dev/null; then
|
||
echo " -> 已存在 $NEW_RELEASE_DIR,跳过打包"
|
||
else
|
||
# 临时修改版本号
|
||
node -e "
|
||
const fs = require('fs');
|
||
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
|
||
pkg.version = '$NEW_VERSION';
|
||
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n');
|
||
"
|
||
echo " -> package.json version 临时改为 $NEW_VERSION"
|
||
|
||
npm run dist:unsigned:local || true
|
||
|
||
# 恢复版本号
|
||
node -e "
|
||
const fs = require('fs');
|
||
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
|
||
pkg.version = '$OLD_VERSION';
|
||
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n');
|
||
"
|
||
echo " -> package.json version 已恢复为 $OLD_VERSION"
|
||
fi
|
||
echo ""
|
||
|
||
# ---------- Step 3: 启动本地更新服务器 ----------
|
||
echo "[3/4] 启动本地更新服务器 ..."
|
||
echo " -> 托管目录: $NEW_RELEASE_DIR"
|
||
echo " -> 地址: http://localhost:$SERVE_PORT"
|
||
echo ""
|
||
|
||
# 检查 latest*.yml 是否存在
|
||
if ! ls "$NEW_RELEASE_DIR"/latest*.yml 2>/dev/null | head -1 > /dev/null; then
|
||
echo "❌ 错误: $NEW_RELEASE_DIR 中缺少 latest*.yml 文件"
|
||
echo " electron-updater 需要此文件来检测更新"
|
||
exit 1
|
||
fi
|
||
|
||
echo " latest*.yml 内容:"
|
||
echo " ---"
|
||
cat "$NEW_RELEASE_DIR"/latest*.yml | head -20 | sed 's/^/ /'
|
||
echo " ---"
|
||
echo ""
|
||
|
||
# 后台启动 HTTP 服务
|
||
npx serve "$NEW_RELEASE_DIR" -p $SERVE_PORT --no-clipboard &
|
||
SERVE_PID=$!
|
||
sleep 2
|
||
|
||
# 验证服务启动
|
||
if ! curl -s "http://localhost:$SERVE_PORT/" > /dev/null 2>&1; then
|
||
echo "❌ HTTP 服务启动失败"
|
||
kill $SERVE_PID 2>/dev/null || true
|
||
exit 1
|
||
fi
|
||
echo " -> HTTP 服务已启动 (PID: $SERVE_PID)"
|
||
echo ""
|
||
|
||
# ---------- Step 4: 启动旧版客户端 ----------
|
||
echo "[4/4] 启动旧版客户端 ..."
|
||
echo ""
|
||
|
||
APP_PATH=""
|
||
if [ "$(uname)" = "Darwin" ]; then
|
||
# macOS: 找 .app
|
||
APP_PATH=$(find "$OLD_RELEASE_DIR" -name "*.app" -maxdepth 2 | head -1)
|
||
if [ -z "$APP_PATH" ]; then
|
||
# 可能在 mac-arm64 或 mac 子目录
|
||
APP_PATH=$(find "$OLD_RELEASE_DIR" -name "*.app" -maxdepth 3 | head -1)
|
||
fi
|
||
elif [ "$(uname)" = "Linux" ]; then
|
||
APP_PATH=$(find "$OLD_RELEASE_DIR" -name "*.AppImage" | head -1)
|
||
fi
|
||
|
||
if [ -z "$APP_PATH" ]; then
|
||
echo "⚠️ 未找到旧版安装包,请手动启动:"
|
||
echo ""
|
||
echo " macOS:"
|
||
echo " QIMING_UPDATE_SERVER=http://localhost:$SERVE_PORT open \"$OLD_RELEASE_DIR/mac-arm64/QimingClaw.app\""
|
||
echo ""
|
||
echo " 或直接运行二进制:"
|
||
echo " QIMING_UPDATE_SERVER=http://localhost:$SERVE_PORT \"$OLD_RELEASE_DIR/mac-arm64/QimingClaw.app/Contents/MacOS/QimingClaw\""
|
||
echo ""
|
||
else
|
||
echo " 找到旧版应用: $APP_PATH"
|
||
echo ""
|
||
if [ "$(uname)" = "Darwin" ]; then
|
||
BINARY_PATH="$APP_PATH/Contents/MacOS/QimingClaw"
|
||
echo " 启动命令:"
|
||
echo " QIMING_UPDATE_SERVER=http://localhost:$SERVE_PORT \"$BINARY_PATH\""
|
||
echo ""
|
||
echo " 按 Enter 启动,或 Ctrl+C 取消 ..."
|
||
read -r
|
||
QIMING_UPDATE_SERVER="http://localhost:$SERVE_PORT" "$BINARY_PATH" &
|
||
else
|
||
echo " 启动命令:"
|
||
echo " QIMING_UPDATE_SERVER=http://localhost:$SERVE_PORT \"$APP_PATH\""
|
||
echo ""
|
||
echo " 按 Enter 启动,或 Ctrl+C 取消 ..."
|
||
read -r
|
||
QIMING_UPDATE_SERVER="http://localhost:$SERVE_PORT" "$APP_PATH" &
|
||
fi
|
||
fi
|
||
|
||
echo ""
|
||
echo "========================================="
|
||
echo " 测试指引"
|
||
echo "========================================="
|
||
echo " 1. 打开「关于」页面"
|
||
echo " 2. 点「检查更新」或等 10 秒自动检查"
|
||
echo " 3. 应显示「发现新版本: v$NEW_VERSION」"
|
||
echo " 4. 点「下载更新」,观察进度条"
|
||
echo " 5. 下载完成后点「重启安装」"
|
||
echo "========================================="
|
||
echo ""
|
||
echo " 测试完成后按 Ctrl+C 停止更新服务器"
|
||
|
||
# 等待 Ctrl+C
|
||
trap "echo ''; echo '正在清理...'; kill $SERVE_PID 2>/dev/null; echo '完成'; exit 0" INT TERM
|
||
wait $SERVE_PID 2>/dev/null
|