This commit is contained in:
lendry
2026-06-26 20:15:13 +03:00
parent 95ef9a9862
commit 65abf17421
5 changed files with 210 additions and 2 deletions

View File

@@ -51,9 +51,19 @@ COPY apps/frontend ./apps/frontend
COPY shared ./shared COPY shared ./shared
COPY tsconfig.base.json ./ COPY tsconfig.base.json ./
COPY tauri_app ./tauri_app 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 && 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"] CMD ["build-android-apk"]

View File

@@ -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 VITE_FRONTEND_URL="${VITE_FRONTEND_URL:-${PUBLIC_FRONTEND_URL:-http://localhost:3002}}"
export ANDROID_HOME="${ANDROID_HOME:-/opt/android-sdk}" export ANDROID_HOME="${ANDROID_HOME:-/opt/android-sdk}"
export ANDROID_SDK_ROOT="${ANDROID_SDK_ROOT:-${ANDROID_HOME}}" 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 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)" 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" echo "==> Инициализация Android проекта Tauri"
npm run android:init -- --ci || npm run android:init 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 APK (AGP из шаблона Tauri, без принудительного даунгрейда)"
npm run tauri -- android build --apk npm run tauri -- android build --apk

View File

@@ -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" <<EOF
def googleMirrors = []
def localAgpRepo = new File('${LOCAL_REPO}')
if (localAgpRepo.exists()) {
googleMirrors.add(localAgpRepo.toURI().toString())
}
googleMirrors.addAll([
'https://maven.google.com',
'https://dl.google.com/android/maven2/',
'https://dl.google.com/dl/android/maven2/'
])
gradle.beforeSettings { settings ->
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})"

View File

@@ -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" <<EOF
Local cache for com.android.tools.build:gradle:${AGP_VERSION}
Source: ${MIRROR}
EOF
echo "==> Local AGP repo: ${LOCAL_REPO}"

View File

@@ -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}"