From f7722e28ad2a2f8bfdb7e040762bcf4859e0abcb Mon Sep 17 00:00:00 2001 From: mrleo1nid <43583385+mrleo1nid@users.noreply.github.com> Date: Tue, 20 Oct 2026 22:12:54 +0300 Subject: [PATCH] ci(release): rebalance APK build memory so it does not thrash and get OOM-killed v0.7.3 crawled for 35 minutes at the 6 GB cap and was killed without a log. The container now gets 7 GB, the Gradle heap is 2 GB, the Metro node process is capped at 1.5 GB and the job times out after 60 minutes. Co-Authored-By: Claude Opus 5.5 --- .gitea/workflows/release.yml | 8 ++++++-- docs/ci-cd.md | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index e6d634a..132702a 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -48,6 +48,8 @@ jobs: android: name: android (APK в релиз) needs: release + # Обычно 10–15 минут; дольше — значит, сборка упёрлась в память, лучше упасть, чем держать раннер. + timeout-minutes: 60 runs-on: ubuntu-latest # Постоянные кэши на хосте раннера: дистрибутив и зависимости Gradle, его build cache, Android SDK и NDK # переживают job (−4 мин на релиз). Работают, если в config.yaml раннера разрешены тома @@ -60,7 +62,7 @@ jobs: image: docker.gitea.com/runner-images:ubuntu-latest # Жёсткие пределы контейнера: сборка не должна забирать всю VM раннера (а через неё — хост гипервизора). # Своп запрещён (memory-swap = memory): лучше OOM внутри контейнера, чем подвисший хост. - options: --cpus=3 --memory=6g --memory-swap=6g + options: --cpus=3 --memory=7g --memory-swap=7g volumes: - /opt/ci-cache/gradle:/root/.gradle - /opt/ci-cache/android:/root/.android @@ -106,6 +108,8 @@ jobs: # CMake / ninja нативной части React Native по умолчанию берут все ядра — ограничиваем. CMAKE_BUILD_PARALLEL_LEVEL: "2" NINJAFLAGS: "-j2" + # JS-бандл (Metro) собирается внутри Gradle отдельным node — не даём ему разрастись. + NODE_OPTIONS: "--max-old-space-size=1536" # Только arm64-v8a: C++-часть React Native собирается под каждую ABI, и четыре ABI # вместе с NDK (~2.5 ГБ) не помещаются на диск раннера. arm64 — все устройства с 2017+. # Память: на раннере 8 ГБ, и без ограничений Gradle + демон Kotlin + Metro вызывают OOM killer. @@ -120,7 +124,7 @@ jobs: cd android # nice / ionice: сборка уступает CPU и диск всему остальному на машине gradle=(nice -n 19 ionice -c 3 ./gradlew --max-workers=2 --build-cache -PreactNativeArchitectures=arm64-v8a - -Pkotlin.compiler.execution.strategy=in-process -Dorg.gradle.jvmargs="-Xmx2560m -XX:MaxMetaspaceSize=512m") + -Pkotlin.compiler.execution.strategy=in-process -Dorg.gradle.jvmargs="-Xmx2048m -XX:MaxMetaspaceSize=512m") # Без New Architecture (app.config.ts) CMake приложения не собирается — отдельный codegen не нужен. if grep -q '^newArchEnabled=true' gradle.properties; then "${gradle[@]}" generateCodegenArtifactsFromSchema diff --git a/docs/ci-cd.md b/docs/ci-cd.md index 7ac86ca..2adf49b 100644 --- a/docs/ci-cd.md +++ b/docs/ci-cd.md @@ -103,7 +103,7 @@ container: - /opt/ci-cache/** # постоянные кэши Gradle и Android SDK для job android в release.yml ``` -Сборка APK ограничена сама (`release.yml`: контейнер `--cpus=3 --memory=6g` без свопа, CMake / ninja / Gradle +Сборка APK ограничена сама (`release.yml`: контейнер `--cpus=3 --memory=7g` без свопа, Gradle `-Xmx2g`, Metro `--max-old-space-size=1536`, таймаут 60 мин, CMake / ninja / Gradle по 2 потока, `nice` / `ionice`). Если раннер — VM в гипервизоре (Proxmox), дополнительно ограничьте её там: фиксированная RAM без ballooning, сумма RAM всех VM меньше RAM хоста, `cpulimit` ≤ половины ядер хоста, лимит дискового I/O — иначе тяжёлая сборка может подвесить весь хост.