From 65abf174219a9114b57a16786ee7d29ccefe5c5d Mon Sep 17 00:00:00 2001 From: lendry Date: Fri, 26 Jun 2026 20:15:13 +0300 Subject: [PATCH] fix --- tauri_app/Dockerfile.apk | 14 ++- tauri_app/docker/build-android-apk.sh | 5 + .../docker/patch-android-gradle-repos.sh | 103 ++++++++++++++++++ tauri_app/docker/prefetch-android-agp.sh | 48 ++++++++ tauri_app/docker/warm-gradle-cache.sh | 42 +++++++ 5 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 tauri_app/docker/patch-android-gradle-repos.sh create mode 100644 tauri_app/docker/prefetch-android-agp.sh create mode 100644 tauri_app/docker/warm-gradle-cache.sh diff --git a/tauri_app/Dockerfile.apk b/tauri_app/Dockerfile.apk index 06b099a..f62dfb4 100644 --- a/tauri_app/Dockerfile.apk +++ b/tauri_app/Dockerfile.apk @@ -51,9 +51,19 @@ COPY apps/frontend ./apps/frontend COPY shared ./shared COPY tsconfig.base.json ./ COPY tauri_app ./tauri_app -COPY tauri_app/docker/build-android-apk.sh /usr/local/bin/build-android-apk -RUN sed -i 's/\r$//' /usr/local/bin/build-android-apk \ +RUN sed -i 's/\r$//' tauri_app/docker/*.sh \ + && chmod +x tauri_app/docker/*.sh \ + && cp tauri_app/docker/build-android-apk.sh /usr/local/bin/build-android-apk \ && chmod +x /usr/local/bin/build-android-apk +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=https://id.lendry.ru +ENV VITE_FRONTEND_URL=https://id.lendry.ru +RUN /workspace/tauri_app/docker/warm-gradle-cache.sh + CMD ["build-android-apk"] diff --git a/tauri_app/docker/build-android-apk.sh b/tauri_app/docker/build-android-apk.sh index ebb158d..890d7e8 100644 --- a/tauri_app/docker/build-android-apk.sh +++ b/tauri_app/docker/build-android-apk.sh @@ -7,6 +7,8 @@ export VITE_API_URL="${VITE_API_URL:-${PUBLIC_API_URL:-http://localhost:3000}}" export VITE_FRONTEND_URL="${VITE_FRONTEND_URL:-${PUBLIC_FRONTEND_URL:-http://localhost:3002}}" export ANDROID_HOME="${ANDROID_HOME:-/opt/android-sdk}" export ANDROID_SDK_ROOT="${ANDROID_SDK_ROOT:-${ANDROID_HOME}}" +export GRADLE_USER_HOME="${GRADLE_USER_HOME:-/root/.gradle}" +export ANDROID_AGP_LOCAL_REPO="${ANDROID_AGP_LOCAL_REPO:-/opt/android-agp-maven}" if [ -z "${ANDROID_NDK_HOME:-}" ]; then NDK_DIR="$(find "${ANDROID_HOME}/ndk" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort -V | tail -n 1 || true)" @@ -39,6 +41,9 @@ fi echo "==> Инициализация Android проекта Tauri" 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, без принудительного даунгрейда)" npm run tauri -- android build --apk diff --git a/tauri_app/docker/patch-android-gradle-repos.sh b/tauri_app/docker/patch-android-gradle-repos.sh new file mode 100644 index 0000000..4afe194 --- /dev/null +++ b/tauri_app/docker/patch-android-gradle-repos.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash +# Adds reliable Google Maven mirrors for Android Gradle Plugin resolution. +set -euo pipefail + +ANDROID_GEN="${1:-/workspace/tauri_app/src-tauri/gen/android}" + +if [ ! -d "${ANDROID_GEN}" ]; then + echo "Android project not found: ${ANDROID_GEN}" >&2 + exit 1 +fi + +GRADLE_USER_HOME="${GRADLE_USER_HOME:-/root/.gradle}" +LOCAL_REPO="${ANDROID_AGP_LOCAL_REPO:-/opt/android-agp-maven}" +mkdir -p "${GRADLE_USER_HOME}/init.d" + +cat > "${GRADLE_USER_HOME}/init.d/agp-repos.gradle" < + settings.pluginManagement { + repositories { + googleMirrors.each { url -> + maven { setUrl(url) } + } + google() + mavenCentral() + gradlePluginPortal() + } + } +} + +allprojects { + buildscript { + repositories { + googleMirrors.each { url -> + maven { setUrl(url) } + } + google() + mavenCentral() + } + } + repositories { + googleMirrors.each { url -> + maven { setUrl(url) } + } + google() + mavenCentral() + } +} +EOF + +insert_maven_repos() { + local file="$1" + [ -f "${file}" ] || return 0 + if grep -q 'maven.google.com' "${file}"; then + return 0 + fi + + awk ' + /repositories[[:space:]]*\{/ { + print + print " maven { url = uri(\"https://maven.google.com\") }" + print " maven { url = uri(\"https://dl.google.com/android/maven2/\") }" + print " maven { url = uri(\"file:///opt/android-agp-maven\") }" + next + } + { print } + ' "${file}" > "${file}.tmp" && mv "${file}.tmp" "${file}" +} + +insert_maven_repos "${ANDROID_GEN}/build.gradle.kts" +insert_maven_repos "${ANDROID_GEN}/buildSrc/build.gradle.kts" +insert_maven_repos "${ANDROID_GEN}/app/build.gradle.kts" 2>/dev/null || true + +if [ -f "${ANDROID_GEN}/settings.gradle" ] && ! grep -q 'pluginManagement' "${ANDROID_GEN}/settings.gradle"; then + { + cat <<'EOF' +pluginManagement { + repositories { + maven { url = uri("file:///opt/android-agp-maven") } + maven { url = uri("https://maven.google.com") } + maven { url = uri("https://dl.google.com/android/maven2/") } + google() + mavenCentral() + gradlePluginPortal() + } +} + +EOF + cat "${ANDROID_GEN}/settings.gradle" + } > "${ANDROID_GEN}/settings.gradle.tmp" && mv "${ANDROID_GEN}/settings.gradle.tmp" "${ANDROID_GEN}/settings.gradle" +fi + +echo "==> Gradle repositories patched for AGP (${ANDROID_GEN})" diff --git a/tauri_app/docker/prefetch-android-agp.sh b/tauri_app/docker/prefetch-android-agp.sh new file mode 100644 index 0000000..813e472 --- /dev/null +++ b/tauri_app/docker/prefetch-android-agp.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# Pre-download Android Gradle Plugin into a local Maven repo inside the image. +set -euo pipefail + +AGP_VERSION="${ANDROID_GRADLE_PLUGIN_VERSION:-8.11.0}" +LOCAL_REPO="${ANDROID_AGP_LOCAL_REPO:-/opt/android-agp-maven}" + +try_download() { + local base_url="$1" + local dest_dir="${LOCAL_REPO}/com/android/tools/build/gradle/${AGP_VERSION}" + mkdir -p "${dest_dir}" + + if curl -fsSL --connect-timeout 20 --max-time 120 \ + "${base_url}/com/android/tools/build/gradle/${AGP_VERSION}/gradle-${AGP_VERSION}.pom" \ + -o "${dest_dir}/gradle-${AGP_VERSION}.pom"; then + curl -fsSL --connect-timeout 20 --max-time 600 \ + "${base_url}/com/android/tools/build/gradle/${AGP_VERSION}/gradle-${AGP_VERSION}.jar" \ + -o "${dest_dir}/gradle-${AGP_VERSION}.jar" + echo "${base_url}" + return 0 + fi + return 1 +} + +echo "==> Prefetch Android Gradle Plugin ${AGP_VERSION}" + +MIRROR="" +for base in \ + "https://maven.google.com" \ + "https://dl.google.com/android/maven2" \ + "https://dl.google.com/dl/android/maven2"; do + if MIRROR="$(try_download "${base}")"; then + echo "==> AGP ${AGP_VERSION} cached from ${MIRROR}" + break + fi +done + +if [ -z "${MIRROR}" ]; then + echo "Не удалось скачать Android Gradle Plugin ${AGP_VERSION} ни из одного зеркала Google Maven" >&2 + exit 1 +fi + +cat > "${LOCAL_REPO}/README.txt" < Local AGP repo: ${LOCAL_REPO}" diff --git a/tauri_app/docker/warm-gradle-cache.sh b/tauri_app/docker/warm-gradle-cache.sh new file mode 100644 index 0000000..26eb861 --- /dev/null +++ b/tauri_app/docker/warm-gradle-cache.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# Warm Gradle cache for Tauri Android buildSrc during Docker image build. +set -euo pipefail + +cd /workspace/tauri_app + +export ANDROID_HOME="${ANDROID_HOME:-/opt/android-sdk}" +export ANDROID_SDK_ROOT="${ANDROID_SDK_ROOT:-${ANDROID_HOME}}" +export GRADLE_USER_HOME="${GRADLE_USER_HOME:-/root/.gradle}" +export ANDROID_AGP_LOCAL_REPO="${ANDROID_AGP_LOCAL_REPO:-/opt/android-agp-maven}" + +if [ -z "${ANDROID_NDK_HOME:-}" ]; then + NDK_DIR="$(find "${ANDROID_HOME}/ndk" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort -V | tail -n 1 || true)" + [ -n "${NDK_DIR}" ] && export ANDROID_NDK_HOME="${NDK_DIR}" && export NDK_HOME="${NDK_DIR}" +fi + +npm run build +rm -rf src-tauri/gen/android +npm run android:init -- --ci + +/workspace/tauri_app/docker/patch-android-gradle-repos.sh /workspace/tauri_app/src-tauri/gen/android + +ANDROID_GEN="/workspace/tauri_app/src-tauri/gen/android" +if [ ! -f "${ANDROID_GEN}/tauri.settings.gradle" ]; then + echo '// Gradle warmup stub; Tauri overwrites this during android build' > "${ANDROID_GEN}/tauri.settings.gradle" +fi +if [ ! -f "${ANDROID_GEN}/app/tauri.build.gradle.kts" ]; then + echo '// Gradle warmup stub; Tauri overwrites this during android build' > "${ANDROID_GEN}/app/tauri.build.gradle.kts" +fi + +cd "${ANDROID_GEN}" +set +e +./gradlew :buildSrc:compileKotlin --no-daemon --stacktrace +GRADLE_EXIT=$? +set -e + +if [ -d "${GRADLE_USER_HOME}/caches/modules-2/files-2.1/com.android.tools.build/gradle/8.11.0" ]; then + echo "==> Android Gradle Plugin cached in ${GRADLE_USER_HOME}" + exit 0 +fi + +exit "${GRADLE_EXIT}"