119 lines
5.6 KiB
Bash
Executable File
119 lines
5.6 KiB
Bash
Executable File
#!/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 -h 127.0.0.1 -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 -h 127.0.0.1 -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
|
||
|
||
# 停掉 Gradle Daemon(编译残留常驻 ~3GB 内存,下次编译会自动重启)
|
||
echo "▶ 清理 Gradle Daemon..."
|
||
(cd "$APP_DIR/android" && ./gradlew --stop >/dev/null 2>&1) || true
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 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
|
||
|
||
# 读出当前 min_version_code,发版时保留不重置
|
||
MIN_CODE=$(mysql -h 127.0.0.1 -u "$DB_USER" -p"$DB_PASS" -P "$DB_PORT" "$DB_NAME" -Nse \
|
||
"SELECT JSON_UNQUOTE(JSON_EXTRACT(config_value, '$.min_version_code')) \
|
||
FROM system_configs WHERE config_key='app.version.android';" 2>/dev/null || echo "")
|
||
MIN_CODE="${MIN_CODE:-1}"
|
||
|
||
UPDATE_JSON="{\"latest_version\":\"$VERSION_NAME\",\"latest_version_code\":$NEW_CODE,\"min_version_code\":$MIN_CODE,\"update_url\":\"https://h5.256kb.top/downloads/video-app.apk\",\"notice\":\"\"}"
|
||
|
||
echo "▶ 同步 DB app.version.android → $UPDATE_JSON"
|
||
mysql -h 127.0.0.1 -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
|
||
docker exec my-redis 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';\""
|