diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 7097d6b..dcd355f 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -70,18 +70,24 @@ jobs: - name: Сборка APK working-directory: apps/mobile env: - # CI=1 — Metro без file watcher; NODE_ENV нужен expo для выбора .env-файлов + # CI=1 — Metro без file watcher и с 2 воркерами (metro.config.js); NODE_ENV нужен expo для .env-файлов CI: "1" NODE_ENV: production # Только arm64-v8a: C++-часть React Native собирается под каждую ABI, и четыре ABI # вместе с NDK (~2.5 ГБ) не помещаются на диск раннера. arm64 — все устройства с 2017+. + # Память: на раннере 8 ГБ, и без ограничений Gradle + демон Kotlin + Metro вызывают OOM killer. + # Kotlin компилируется внутри JVM Gradle (без второго демона, поэтому heap 2.5 ГБ вместо 2), задач — не больше 2. run: | npx expo prebuild --platform android --clean --no-install - cd android && ./gradlew --no-daemon assembleRelease -PreactNativeArchitectures=arm64-v8a + cd android + ./gradlew --no-daemon --max-workers=2 assembleRelease -PreactNativeArchitectures=arm64-v8a -Pkotlin.compiler.execution.strategy=in-process -Dorg.gradle.jvmargs="-Xmx2560m -XX:MaxMetaspaceSize=512m" - name: Свободное место после сбоя if: failure() - run: df -h / /tmp; du -sh ~/.gradle ~/.android apps/mobile/android 2>/dev/null || true + run: | + df -h / /tmp; free -m || true + du -sh ~/.gradle ~/.android apps/mobile/android 2>/dev/null || true + dmesg 2>/dev/null | grep -iE "killed process|out of memory" | tail -5 || true - name: Подпись APK env: diff --git a/apps/mobile/metro.config.js b/apps/mobile/metro.config.js index 3d778bd..0cbcc5e 100644 --- a/apps/mobile/metro.config.js +++ b/apps/mobile/metro.config.js @@ -15,4 +15,7 @@ const nativeBuildOutputs = /[\\/]android[\\/](build|\.cxx|\.gradle)[\\/].*/; config.resolver.blockList = [...[].concat(config.resolver.blockList ?? []), ...nativeDirs, nativeBuildOutputs]; +// В CI раннер делит 8 ГБ RAM с Gradle: по умолчанию Metro запускает воркер на каждое ядро. +if (process.env.CI) config.maxWorkers = 2; + module.exports = config;