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 <noreply@anthropic.com>
This commit is contained in:
1 parent
ed0302d90f
commit
c1f206c99d
2 files changed
+7
-3
No files matched your search
@@ -48,6 +48,8 @@ jobs:
|
|||||||
android:
|
android:
|
||||||
name: android (APK в релиз)
|
name: android (APK в релиз)
|
||||||
needs: release
|
needs: release
|
||||||
|
# Обычно 10–15 минут; дольше — значит, сборка упёрлась в память, лучше упасть, чем держать раннер.
|
||||||
|
timeout-minutes: 60
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
# Постоянные кэши на хосте раннера: дистрибутив и зависимости Gradle, его build cache, Android SDK и NDK
|
# Постоянные кэши на хосте раннера: дистрибутив и зависимости Gradle, его build cache, Android SDK и NDK
|
||||||
# переживают job (−4 мин на релиз). Работают, если в config.yaml раннера разрешены тома
|
# переживают job (−4 мин на релиз). Работают, если в config.yaml раннера разрешены тома
|
||||||
@@ -60,7 +62,7 @@ jobs:
|
|||||||
image: docker.gitea.com/runner-images:ubuntu-latest
|
image: docker.gitea.com/runner-images:ubuntu-latest
|
||||||
# Жёсткие пределы контейнера: сборка не должна забирать всю VM раннера (а через неё — хост гипервизора).
|
# Жёсткие пределы контейнера: сборка не должна забирать всю VM раннера (а через неё — хост гипервизора).
|
||||||
# Своп запрещён (memory-swap = memory): лучше OOM внутри контейнера, чем подвисший хост.
|
# Своп запрещён (memory-swap = memory): лучше OOM внутри контейнера, чем подвисший хост.
|
||||||
options: --cpus=3 --memory=6g --memory-swap=6g
|
options: --cpus=3 --memory=7g --memory-swap=7g
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/ci-cache/gradle:/root/.gradle
|
- /opt/ci-cache/gradle:/root/.gradle
|
||||||
- /opt/ci-cache/android:/root/.android
|
- /opt/ci-cache/android:/root/.android
|
||||||
@@ -106,6 +108,8 @@ jobs:
|
|||||||
# CMake / ninja нативной части React Native по умолчанию берут все ядра — ограничиваем.
|
# CMake / ninja нативной части React Native по умолчанию берут все ядра — ограничиваем.
|
||||||
CMAKE_BUILD_PARALLEL_LEVEL: "2"
|
CMAKE_BUILD_PARALLEL_LEVEL: "2"
|
||||||
NINJAFLAGS: "-j2"
|
NINJAFLAGS: "-j2"
|
||||||
|
# JS-бандл (Metro) собирается внутри Gradle отдельным node — не даём ему разрастись.
|
||||||
|
NODE_OPTIONS: "--max-old-space-size=1536"
|
||||||
# Только arm64-v8a: C++-часть React Native собирается под каждую ABI, и четыре ABI
|
# Только arm64-v8a: C++-часть React Native собирается под каждую ABI, и четыре ABI
|
||||||
# вместе с NDK (~2.5 ГБ) не помещаются на диск раннера. arm64 — все устройства с 2017+.
|
# вместе с NDK (~2.5 ГБ) не помещаются на диск раннера. arm64 — все устройства с 2017+.
|
||||||
# Память: на раннере 8 ГБ, и без ограничений Gradle + демон Kotlin + Metro вызывают OOM killer.
|
# Память: на раннере 8 ГБ, и без ограничений Gradle + демон Kotlin + Metro вызывают OOM killer.
|
||||||
@@ -120,7 +124,7 @@ jobs:
|
|||||||
cd android
|
cd android
|
||||||
# nice / ionice: сборка уступает CPU и диск всему остальному на машине
|
# nice / ionice: сборка уступает CPU и диск всему остальному на машине
|
||||||
gradle=(nice -n 19 ionice -c 3 ./gradlew --max-workers=2 --build-cache -PreactNativeArchitectures=arm64-v8a
|
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 не нужен.
|
# Без New Architecture (app.config.ts) CMake приложения не собирается — отдельный codegen не нужен.
|
||||||
if grep -q '^newArchEnabled=true' gradle.properties; then
|
if grep -q '^newArchEnabled=true' gradle.properties; then
|
||||||
"${gradle[@]}" generateCodegenArtifactsFromSchema
|
"${gradle[@]}" generateCodegenArtifactsFromSchema
|
||||||
|
|||||||
+1
-1
@@ -103,7 +103,7 @@ container:
|
|||||||
- /opt/ci-cache/** # постоянные кэши Gradle и Android SDK для job android в release.yml
|
- /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), дополнительно ограничьте её там:
|
по 2 потока, `nice` / `ionice`). Если раннер — VM в гипервизоре (Proxmox), дополнительно ограничьте её там:
|
||||||
фиксированная RAM без ballooning, сумма RAM всех VM меньше RAM хоста, `cpulimit` ≤ половины ядер хоста,
|
фиксированная RAM без ballooning, сумма RAM всех VM меньше RAM хоста, `cpulimit` ≤ половины ядер хоста,
|
||||||
лимит дискового I/O — иначе тяжёлая сборка может подвесить весь хост.
|
лимит дискового I/O — иначе тяжёлая сборка может подвесить весь хост.
|
||||||
|
|||||||
Reference in new issue
Block a user