diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 7dddcf9..66c30d3 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -58,6 +58,9 @@ jobs: shell: bash container: image: docker.gitea.com/runner-images:ubuntu-latest + # Жёсткие пределы контейнера: сборка не должна забирать всю VM раннера (а через неё — хост гипервизора). + # Своп запрещён (memory-swap = memory): лучше OOM внутри контейнера, чем подвисший хост. + options: --cpus=3 --memory=6g --memory-swap=6g volumes: - /opt/ci-cache/gradle:/root/.gradle - /opt/ci-cache/android:/root/.android @@ -100,6 +103,9 @@ jobs: # CI=1 — Metro без file watcher и с 2 воркерами (metro.config.js); NODE_ENV нужен expo для .env-файлов CI: "1" NODE_ENV: production + # CMake / ninja нативной части React Native по умолчанию берут все ядра — ограничиваем. + CMAKE_BUILD_PARALLEL_LEVEL: "2" + NINJAFLAGS: "-j2" # Только arm64-v8a: C++-часть React Native собирается под каждую ABI, и четыре ABI # вместе с NDK (~2.5 ГБ) не помещаются на диск раннера. arm64 — все устройства с 2017+. # Память: на раннере 8 ГБ, и без ограничений Gradle + демон Kotlin + Metro вызывают OOM killer. @@ -111,7 +117,8 @@ jobs: run: | npx expo prebuild --platform android --clean --no-install cd android - gradle=(./gradlew --max-workers=2 --build-cache -PreactNativeArchitectures=arm64-v8a + # 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") # Без New Architecture (app.config.ts) CMake приложения не собирается — отдельный codegen не нужен. if grep -q '^newArchEnabled=true' gradle.properties; then diff --git a/docs/ci-cd.md b/docs/ci-cd.md index 4d1791e..7ac86ca 100644 --- a/docs/ci-cd.md +++ b/docs/ci-cd.md @@ -103,6 +103,11 @@ container: - /opt/ci-cache/** # постоянные кэши Gradle и Android SDK для job android в release.yml ``` +Сборка APK ограничена сама (`release.yml`: контейнер `--cpus=3 --memory=6g` без свопа, CMake / ninja / Gradle +по 2 потока, `nice` / `ionice`). Если раннер — VM в гипервизоре (Proxmox), дополнительно ограничьте её там: +фиксированная RAM без ballooning, сумма RAM всех VM меньше RAM хоста, `cpulimit` ≤ половины ядер хоста, +лимит дискового I/O — иначе тяжёлая сборка может подвесить весь хост. + Без `valid_volumes` раннер пропускает тома из `release.yml`, и каждый релиз заново качает Gradle и NDK (~4 мин). Признак выключенного кэша actions в логах — `Cache action is only supported on GHES…`.