#!/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';\""