diff --git a/.dockerignore b/.dockerignore index 2e0ea56..bd603f6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -10,3 +10,9 @@ apps/sso-core/.env coverage *.log *.tsbuildinfo +**/*.apk +tauri_app/src-tauri/gen +tauri_app/src-tauri/target +tauri_app/docker/agp-resolver/.gradle +tauri_app/docker/agp-resolver/build +tauri_app/docker/offline-maven/.agp-offline-complete diff --git a/docker-compose.yml b/docker-compose.yml index 4b4ea67..055a28a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -235,8 +235,6 @@ services: dockerfile: tauri_app/Dockerfile.apk args: NPM_REGISTRY: ${NPM_REGISTRY:-https://registry.npmjs.org} - PUBLIC_API_URL: ${PUBLIC_API_URL:-http://localhost:3000} - PUBLIC_FRONTEND_URL: ${PUBLIC_FRONTEND_URL:-http://localhost:3002} container_name: lendry-id-tauri-apk-builder restart: "no" environment: diff --git a/tauri_app/Dockerfile.apk b/tauri_app/Dockerfile.apk index 5f035d1..66f0fdd 100644 --- a/tauri_app/Dockerfile.apk +++ b/tauri_app/Dockerfile.apk @@ -7,8 +7,6 @@ ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 ENV PATH=/root/.cargo/bin:/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/platform-tools:/usr/local/bin:$PATH ARG NPM_REGISTRY=https://registry.npmjs.org -ARG PUBLIC_API_URL=http://localhost:3000 -ARG PUBLIC_FRONTEND_URL=http://localhost:3002 RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ @@ -24,9 +22,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ RUN if [ ! -d "${ANDROID_HOME}" ] && [ -d /opt/android-sdk-linux ]; then ln -s /opt/android-sdk-linux "${ANDROID_HOME}"; fi \ && (sdkmanager --version || true) \ - && test -d "${ANDROID_HOME}/platforms" \ + && test -d "${ANDROID_HOME}/platforms/android-35" \ && test -d "${ANDROID_HOME}/build-tools" \ - && test -d "${ANDROID_HOME}/platform-tools" + && test -d "${ANDROID_HOME}/platform-tools" \ + && test -d "${ANDROID_HOME}/ndk" RUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - \ && apt-get update \ @@ -62,10 +61,7 @@ RUN sed -i 's/\r$//' tauri_app/docker/*.sh \ ENV ANDROID_AGP_LOCAL_REPO=/opt/android-agp-maven ENV GRADLE_USER_HOME=/root/.gradle -RUN /workspace/tauri_app/docker/prefetch-android-agp.sh - -ENV VITE_API_URL=${PUBLIC_API_URL} -ENV VITE_FRONTEND_URL=${PUBLIC_FRONTEND_URL} -RUN /workspace/tauri_app/docker/warm-gradle-cache.sh +RUN /workspace/tauri_app/docker/prefetch-android-agp.sh \ + && /workspace/tauri_app/docker/verify-offline-agp.sh CMD ["build-android-apk"] diff --git a/tauri_app/docker/build-android-apk.sh b/tauri_app/docker/build-android-apk.sh index 890d7e8..9e9673d 100644 --- a/tauri_app/docker/build-android-apk.sh +++ b/tauri_app/docker/build-android-apk.sh @@ -44,7 +44,10 @@ npm run android:init -- --ci || npm run android:init echo "==> Настройка репозиториев Gradle (Google Maven + локальный кэш AGP)" /workspace/tauri_app/docker/patch-android-gradle-repos.sh /workspace/tauri_app/src-tauri/gen/android -echo "==> Сборка Android APK (AGP из шаблона Tauri, без принудительного даунгрейда)" +echo "==> Настройка Android SDK (offline, без загрузки platform из Google)" +/workspace/tauri_app/docker/patch-android-sdk.sh /workspace/tauri_app/src-tauri/gen/android + +echo "==> Сборка Android APK" npm run tauri -- android build --apk APK_PATH="$(find /workspace/tauri_app/src-tauri/gen/android -type f -name '*.apk' | sort | tail -n 1 || true)" diff --git a/tauri_app/docker/patch-android-sdk.sh b/tauri_app/docker/patch-android-sdk.sh new file mode 100644 index 0000000..3c47a25 --- /dev/null +++ b/tauri_app/docker/patch-android-sdk.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +# Align Tauri Android project with locally installed SDK (offline builds). +set -euo pipefail + +ANDROID_GEN="${1:-/workspace/tauri_app/src-tauri/gen/android}" +ANDROID_HOME="${ANDROID_HOME:-/opt/android-sdk}" +ANDROID_SDK_ROOT="${ANDROID_SDK_ROOT:-${ANDROID_HOME}}" + +if [ ! -d "${ANDROID_GEN}" ]; then + echo "Android project not found: ${ANDROID_GEN}" >&2 + exit 1 +fi + +if [ ! -d "${ANDROID_HOME}/platforms" ] && [ -d /opt/android-sdk-linux/platforms ]; then + ANDROID_HOME="/opt/android-sdk-linux" + ANDROID_SDK_ROOT="${ANDROID_HOME}" +fi + +if [ ! -d "${ANDROID_HOME}/platforms" ]; then + echo "Android platforms not found in ${ANDROID_HOME}/platforms" >&2 + exit 1 +fi + +SDK_LEVEL="$( + find "${ANDROID_HOME}/platforms" -mindepth 1 -maxdepth 1 -type d -name 'android-*' \ + | sed 's|.*/android-||' \ + | sort -n \ + | tail -n 1 +)" + +if [ -z "${SDK_LEVEL}" ]; then + echo "Не удалось определить установленный Android SDK platform" >&2 + exit 1 +fi + +APP_BUILD="${ANDROID_GEN}/app/build.gradle.kts" +if [ -f "${APP_BUILD}" ]; then + sed -i -E "s/compileSdk = [0-9]+/compileSdk = ${SDK_LEVEL}/g" "${APP_BUILD}" + sed -i -E "s/targetSdk = [0-9]+/targetSdk = ${SDK_LEVEL}/g" "${APP_BUILD}" +fi + +GRADLE_PROPS="${ANDROID_GEN}/gradle.properties" +touch "${GRADLE_PROPS}" +if ! grep -q '^android.builder.sdkDownload=' "${GRADLE_PROPS}"; then + printf '\n# Offline / isolated network: do not download SDK packages from Google\nandroid.builder.sdkDownload=false\n' >> "${GRADLE_PROPS}" +else + sed -i 's/^android.builder.sdkDownload=.*/android.builder.sdkDownload=false/' "${GRADLE_PROPS}" +fi + +cat > "${ANDROID_GEN}/local.properties" < Android SDK patched: compileSdk/targetSdk=${SDK_LEVEL}, sdk.dir=${ANDROID_HOME}, sdkDownload=false" diff --git a/tauri_app/docker/verify-offline-agp.sh b/tauri_app/docker/verify-offline-agp.sh new file mode 100644 index 0000000..5fdcb72 --- /dev/null +++ b/tauri_app/docker/verify-offline-agp.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# Validate bundled Android Gradle Plugin cache inside the Docker image. +set -euo pipefail + +AGP_VERSION="${ANDROID_GRADLE_PLUGIN_VERSION:-8.11.0}" +LOCAL_REPO="${ANDROID_AGP_LOCAL_REPO:-/opt/android-agp-maven}" +BUNDLED_REPO="${ANDROID_AGP_BUNDLED_REPO:-/workspace/tauri_app/docker/offline-maven}" + +required=( + "${LOCAL_REPO}/com/android/tools/build/gradle/${AGP_VERSION}/gradle-${AGP_VERSION}.jar" + "${LOCAL_REPO}/com/android/tools/build/builder/${AGP_VERSION}/builder-${AGP_VERSION}.pom" + "${LOCAL_REPO}/com/android/tools/build/builder-model/${AGP_VERSION}/builder-model-${AGP_VERSION}.pom" + "${LOCAL_REPO}/com/android/tools/build/gradle-api/${AGP_VERSION}/gradle-api-${AGP_VERSION}.pom" +) + +for file in "${required[@]}"; do + if [ ! -f "${file}" ]; then + echo "Неполный offline-кэш AGP, отсутствует: ${file}" >&2 + exit 1 + fi +done + +echo "==> Offline AGP ${AGP_VERSION} validated in ${LOCAL_REPO}" + +if [ -d "${BUNDLED_REPO}" ]; then + rm -rf "${BUNDLED_REPO}" + echo "==> Удалён дубликат offline-кэша из ${BUNDLED_REPO} (экономия места в образе)" +fi