Files
video/deploy.sh
T
2026-10-16 22:48:30 +08:00

109 lines
5.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# ============================================================================
# 一键发版脚本:编译 APK → 覆盖两个下载地址 → 同步 DB 版本号 → 清 redis 缓存
# 用法:
# 1. 先改 pubspec.yaml 里的 version(1.1.0+2 → 1.2.0+3,+后面是 version_code)
# 2. 再改 .env 里的 APP_VERSION(可选,默认从 pubspec 自动读)
# 3. bash deploy.sh [latest_version_code] # 默认 +1 递增
#
# 自动更新流程:
# - 脚本会把 DB 里 system_configs.app.version.android 的 latest_version_code
# 和 latest_version 同步到新版
# - 用户打开老版本 APP → 启动时查 /api/v1/app/version → 服务端 latest > local
# → 弹"发现新版本"对话框 → 点立即更新跳 h5.256kb.top 下载页
# - 用户装完新版 → APP 上报的 version_code 等于 DB latest → 不再弹窗
# ============================================================================
set -euo pipefail
PROJECT_ROOT="/root/project/video"
APP_DIR="$PROJECT_ROOT/app"
SERVER_DIR="$PROJECT_ROOT/server"
RUNTIME_DIR="$PROJECT_ROOT/runtime"
APK_PATH="$APP_DIR/build/app/outputs/flutter-apk/app-release.apk"
# APK 统一输出位置(nginx h5.256kb.top/downloads/ alias 到这里)
APK_DEST="$RUNTIME_DIR/downloads/video-app.apk"
# MySQL 连接(与 .env 里一致,Docker MySQL 8 端口 3307)
DB_NAME="video"
DB_USER="root"
DB_PASS="256kb.cn"
DB_PORT="3307"
# --------------------------------------------------------------------------
# 1. 解析 pubspec.yaml 里的 version
# --------------------------------------------------------------------------
echo "▶ 解析 pubspec.yaml 版本号..."
PUBSPEC_VERSION=$(grep -E '^version:' "$APP_DIR/pubspec.yaml" | awk '{print $2}')
VERSION_NAME="${PUBSPEC_VERSION%+*}" # 1.1.0
VERSION_CODE="${PUBSPEC_VERSION##*+}" # 2
echo " pubspec: $VERSION_NAME versionCode=$VERSION_CODE"
# DB 当前 latest_version_code(用于参考)
DB_CURRENT_CODE=$(mysql -u "$DB_USER" -p"$DB_PASS" -P "$DB_PORT" "$DB_NAME" -Nse \
"SELECT JSON_UNQUOTE(JSON_EXTRACT(config_value, '$.latest_version_code')) \
FROM system_configs WHERE config_key='app.version.android';" 2>/dev/null || echo "0")
DB_CURRENT_VER=$(mysql -u "$DB_USER" -p"$DB_PASS" -P "$DB_PORT" "$DB_NAME" -Nse \
"SELECT JSON_UNQUOTE(JSON_EXTRACT(config_value, '$.latest_version')) \
FROM system_configs WHERE config_key='app.version.android';" 2>/dev/null || echo "unknown")
echo " DB 当前 latest: $DB_CURRENT_VER code=$DB_CURRENT_CODE"
# --------------------------------------------------------------------------
# 2. flutter analyze
# --------------------------------------------------------------------------
echo "▶ flutter analyze..."
cd "$APP_DIR"
flutter analyze 2>&1 | tail -3 || true # warning 级问题不阻断发版
echo
# --------------------------------------------------------------------------
# 3. 编译 release APK
# --------------------------------------------------------------------------
echo "▶ flutter build apk --release..."
cd "$APP_DIR"
flutter build apk --release 2>&1 | tail -5
echo
# --------------------------------------------------------------------------
# 4. 部署 APK
# --------------------------------------------------------------------------
echo "▶ 覆盖部署 APK → $APK_DEST"
mkdir -p "$(dirname "$APK_DEST")"
cp "$APK_PATH" "$APK_DEST"
chmod 644 "$APK_DEST"
ls -lh "$APK_DEST"
echo
# --------------------------------------------------------------------------
# 5. 同步 DB 版本配置(让老用户打开 APP 时能看到更新提示)
# --------------------------------------------------------------------------
NEW_CODE="$VERSION_CODE"
# 如果显式传了参数,强制用它
if [ -n "${1:-}" ]; then
NEW_CODE="$1"
fi
UPDATE_JSON="{\"latest_version\":\"$VERSION_NAME\",\"latest_version_code\":$NEW_CODE,\"min_version_code\":1,\"update_url\":\"https://h5.256kb.top/downloads/video-app.apk\",\"notice\":\"\"}"
echo "▶ 同步 DB app.version.android → $UPDATE_JSON"
mysql -u "$DB_USER" -p"$DB_PASS" -P "$DB_PORT" "$DB_NAME" -e "
INSERT INTO system_configs (config_key, config_value, description)
VALUES ('app.version.android', '$UPDATE_JSON', 'Android 版本检查配置')
ON DUPLICATE KEY UPDATE config_value=VALUES(config_value), updated_at=NOW();
" 2>/dev/null
redis-cli DEL config:system >/dev/null 2>&1 || true
echo
echo "✅ 发版完成"
echo
echo " APK: $APK_DEST"
echo " 版本: $VERSION_NAME (versionCode=$NEW_CODE)"
echo " 下载: https://h5.256kb.top/downloads/video-app.apk"
echo
echo " 老用户(versionCode < $NEW_CODE)打开 APP 会弹更新提示"
echo " 装完新版后提示自动消失"
echo
echo " 如需强制更新:把 min_version_code 改得比用户基数高(如 999)"
echo " $ mysql -u $DB_USER -p$DB_PASS -P $DB_PORT $DB_NAME -e \"UPDATE system_configs SET config_value='{\\\"latest_version\\\":\\\"$VERSION_NAME\\\",\\\"latest_version_code\\\":$NEW_CODE,\\\"min_version_code\\\":999,\\\"update_url\\\":\\\"https://h5.256kb.top/downloads/video-app.apk\\\",\\\"notice\\\":\\\"\\\"}' WHERE config_key='app.version.android';\""