Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/scripts/ensure_flutter_sdk_for_update.sh

180 lines
5.5 KiB
Shell
Executable file

#!/usr/bin/env bash
# Ensure Flutter Dart SDK + web engine artifacts before web build (update.sh / deploy).
# - Optional git update to origin/stable only when HESABIX_UPDATE_FLUTTER_SDK=1
# - Resolve FLUTTER_STORAGE_BASE_URL to a mirror that has engine artifacts (sky_engine.zip)
# - Download Dart SDK / precache web with storage mirror fallbacks
set -euo pipefail
APP_ROOT="${APP_ROOT:-/opt/hesabix}"
FLUTTER_ROOT="${FLUTTER_ROOT:-/opt/flutter}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=scripts/mirror_config.sh
if [[ -r "${SCRIPT_DIR}/mirror_config.sh" ]]; then
# shellcheck disable=SC1091
source "${SCRIPT_DIR}/mirror_config.sh"
fi
log() { echo "ensure_flutter_sdk: $*" >&2; }
_dart_sdk_ready() {
local dart_bin="${FLUTTER_ROOT}/bin/cache/dart-sdk/bin/dart"
[[ -x "$dart_bin" ]] && "$dart_bin" --version >/dev/null 2>&1
}
_ensure_dart_sdk_with_mirror() {
local base update_script
update_script="${FLUTTER_ROOT}/bin/internal/update_dart_sdk.sh"
[[ -f "$update_script" ]] || {
log "missing ${update_script}"
return 1
}
while IFS= read -r base; do
[[ -n "$base" ]] || continue
log "Ensuring Dart SDK via FLUTTER_STORAGE_BASE_URL=${base}"
if env FLUTTER_STORAGE_BASE_URL="$base" bash "$update_script" >/dev/null 2>&1; then
if _dart_sdk_ready; then
log "Dart SDK ready (${base})"
return 0
fi
fi
rm -f "${FLUTTER_ROOT}/bin/cache/dart-sdk-linux-x64.zip" 2>/dev/null || true
rm -f "${FLUTTER_ROOT}/bin/cache/dart-sdk-linux-arm64.zip" 2>/dev/null || true
done < <(hesabix_flutter_storage_fallback_bases)
return 1
}
_restore_dart_sdk_backup() {
local dart_sdk="${FLUTTER_ROOT}/bin/cache/dart-sdk"
local dart_old="${FLUTTER_ROOT}/bin/cache/dart-sdk.old"
if [[ -d "${dart_old}/bin" ]]; then
log "Restoring Dart SDK from dart-sdk.old"
rm -rf "$dart_sdk"
mv "$dart_old" "$dart_sdk"
_dart_sdk_ready
return $?
fi
return 1
}
maybe_update_flutter_git() {
local flag="${HESABIX_UPDATE_FLUTTER_SDK:-0}"
if [[ ! "$flag" =~ ^(1|[Yy]|[Yy][Ee][Ss]|true)$ ]]; then
log "Skipping Flutter SDK git update (set HESABIX_UPDATE_FLUTTER_SDK=1 to upgrade stable)"
return 0
fi
[[ -d "${FLUTTER_ROOT}/.git" ]] || {
log "No git checkout at ${FLUTTER_ROOT}; skip git update"
return 0
}
local prev_commit
prev_commit="$(git -C "$FLUTTER_ROOT" rev-parse HEAD 2>/dev/null || true)"
log "Updating Flutter SDK git to origin/stable (was ${prev_commit:-unknown})"
if ! (cd "$FLUTTER_ROOT" && git fetch --depth 1 origin stable && git reset --hard origin/stable); then
log "Flutter git update failed"
return 1
fi
if _ensure_dart_sdk_with_mirror; then
return 0
fi
log "Dart SDK unavailable after Flutter git update; rolling back"
if [[ -n "$prev_commit" ]]; then
git -C "$FLUTTER_ROOT" reset --hard "$prev_commit" || true
fi
_restore_dart_sdk_backup || true
if _dart_sdk_ready; then
log "Rolled back Flutter SDK; Dart toolchain restored"
return 1
fi
return 1
}
ensure_flutter_dart_sdk() {
[[ -d "$FLUTTER_ROOT" ]] || {
log "Flutter not found at ${FLUTTER_ROOT}"
return 1
}
git config --global --add safe.directory "$FLUTTER_ROOT" 2>/dev/null || true
if _dart_sdk_ready; then
log "Dart SDK already OK"
return 0
fi
if _ensure_dart_sdk_with_mirror; then
return 0
fi
if _restore_dart_sdk_backup; then
log "Using backed-up Dart SDK"
return 0
fi
log "Could not provision Dart SDK from any mirror"
return 1
}
_web_artifacts_ready() {
[[ -d "${FLUTTER_ROOT}/bin/cache/flutter_web_sdk/lib" ]] \
&& [[ -d "${FLUTTER_ROOT}/bin/cache/pkg/sky_engine/lib" ]]
}
ensure_flutter_web_artifacts() {
local flutter_bin="${FLUTTER_ROOT}/bin/flutter"
[[ -x "$flutter_bin" ]] || flutter_bin="$(command -v flutter 2>/dev/null || true)"
[[ -n "$flutter_bin" ]] || {
log "flutter binary not found"
return 1
}
if _web_artifacts_ready; then
log "Flutter web artifacts already cached; skipping precache"
return 0
fi
local storage_resolved=0
if declare -F hesabix_resolve_flutter_storage_base_url >/dev/null 2>&1; then
if hesabix_resolve_flutter_storage_base_url; then
storage_resolved=1
fi
fi
if [[ "$storage_resolved" -eq 0 ]]; then
export FLUTTER_STORAGE_BASE_URL="${FLUTTER_STORAGE_BASE_URL:-https://storage.flutter-io.cn}"
log "Storage mirror probe failed; using fallback FLUTTER_STORAGE_BASE_URL=${FLUTTER_STORAGE_BASE_URL}"
fi
export PUB_HOSTED_URL="${PUB_HOSTED_URL:-https://f.mirror.hesabix.ir/pub}"
export PATH="${FLUTTER_ROOT}/bin:/snap/bin:${PATH:-}"
log "Precaching Flutter web artifacts (FLUTTER_STORAGE_BASE_URL=${FLUTTER_STORAGE_BASE_URL})"
if env PUB_HOSTED_URL="${PUB_HOSTED_URL}" FLUTTER_STORAGE_BASE_URL="${FLUTTER_STORAGE_BASE_URL}" \
"$flutter_bin" precache --web --no-android --no-ios --no-linux --no-macos --no-windows --no-fuchsia; then
log "Flutter web artifacts precached"
return 0
fi
if _web_artifacts_ready; then
log "precache reported failure but web artifacts are present; continuing"
return 0
fi
log "flutter precache --web failed"
return 1
}
main() {
if declare -F hesabix_apply_flutter_mirror_env >/dev/null 2>&1; then
hesabix_apply_flutter_mirror_env
else
export PUB_HOSTED_URL="${PUB_HOSTED_URL:-https://f.mirror.hesabix.ir/pub}"
export FLUTTER_STORAGE_BASE_URL="${FLUTTER_STORAGE_BASE_URL:-https://f.mirror.hesabix.ir/gcs}"
fi
maybe_update_flutter_git || true
ensure_flutter_dart_sdk
ensure_flutter_web_artifacts
}
main "$@"