Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b8cfd64208 | ||
|
|
0d9418df48 | ||
|
|
bf3c00ca71 | ||
|
|
633a8f79af |
No files matched your search
@@ -39,5 +39,13 @@ jobs:
|
|||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with: { node-version: "22", cache: pnpm }
|
with: { node-version: "22", cache: pnpm }
|
||||||
- run: pnpm install --frozen-lockfile
|
- run: pnpm install --frozen-lockfile
|
||||||
|
# npx expo-doctor качает пакет в кэш npm; Metro хранит трансформации в /tmp/metro-cache
|
||||||
|
- uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.npm/_npx
|
||||||
|
/tmp/metro-cache
|
||||||
|
key: mobile-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.sha }}
|
||||||
|
restore-keys: mobile-${{ hashFiles('pnpm-lock.yaml') }}-
|
||||||
- run: npx expo-doctor
|
- run: npx expo-doctor
|
||||||
- run: npx expo export --platform android --output-dir dist
|
- run: npx expo export --platform android --output-dir dist
|
||||||
@@ -40,6 +40,12 @@ jobs:
|
|||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with: { node-version: "22", cache: pnpm }
|
with: { node-version: "22", cache: pnpm }
|
||||||
- run: pnpm install --frozen-lockfile
|
- run: pnpm install --frozen-lockfile
|
||||||
|
# Локальный кэш turbo: typecheck/test/build пропускаются для пакетов, чьи входы не менялись
|
||||||
|
- uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: .turbo/cache
|
||||||
|
key: turbo-ts-${{ github.sha }}
|
||||||
|
restore-keys: turbo-ts-
|
||||||
- run: pnpm i18n:check
|
- run: pnpm i18n:check
|
||||||
- run: pnpm test:scripts
|
- run: pnpm test:scripts
|
||||||
- run: pnpm typecheck
|
- run: pnpm typecheck
|
||||||
|
|||||||
@@ -84,8 +84,11 @@ jobs:
|
|||||||
with: { node-version: "${{ env.NODE_VERSION }}", cache: pnpm }
|
with: { node-version: "${{ env.NODE_VERSION }}", cache: pnpm }
|
||||||
- run: pnpm install --frozen-lockfile
|
- run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Свободное место
|
# Диск, память и наполненность постоянных кэшей: пустые ~/.gradle и ~/.android значат, что тома не подключились
|
||||||
run: df -h / /tmp
|
- name: Ресурсы раннера и кэши
|
||||||
|
run: |
|
||||||
|
df -h / /tmp; free -m
|
||||||
|
du -sh ~/.gradle ~/.android 2>/dev/null || true
|
||||||
|
|
||||||
- name: Сборка APK
|
- name: Сборка APK
|
||||||
working-directory: apps/mobile
|
working-directory: apps/mobile
|
||||||
@@ -97,12 +100,20 @@ jobs:
|
|||||||
# вместе с NDK (~2.5 ГБ) не помещаются на диск раннера. arm64 — все устройства с 2017+.
|
# вместе с NDK (~2.5 ГБ) не помещаются на диск раннера. arm64 — все устройства с 2017+.
|
||||||
# Память: на раннере 8 ГБ, и без ограничений Gradle + демон Kotlin + Metro вызывают OOM killer.
|
# Память: на раннере 8 ГБ, и без ограничений Gradle + демон Kotlin + Metro вызывают OOM killer.
|
||||||
# Kotlin компилируется внутри JVM Gradle (без второго демона, поэтому heap 2.5 ГБ вместо 2), задач — не больше 2.
|
# Kotlin компилируется внутри JVM Gradle (без второго демона, поэтому heap 2.5 ГБ вместо 2), задач — не больше 2.
|
||||||
|
# -x lintVitalRelease: lint-проверки для Google Play, а APK публикуется только в Gitea (−1 мин).
|
||||||
|
# Codegen отдельным вызовом до сборки: CMake приложения читает JNI-код, который генерирует codegen
|
||||||
|
# библиотек, но плагин RN не объявляет эту зависимость, и с прогретым кэшем CMake успевал раньше codegen.
|
||||||
|
# Оба вызова идут через один демон Gradle (одинаковые jvmargs), поэтому второй не платит за старт JVM.
|
||||||
run: |
|
run: |
|
||||||
npx expo prebuild --platform android --clean --no-install
|
npx expo prebuild --platform android --clean --no-install
|
||||||
cd android
|
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" --build-cache
|
gradle=(./gradlew --max-workers=2 --build-cache -PreactNativeArchitectures=arm64-v8a
|
||||||
|
-Pkotlin.compiler.execution.strategy=in-process -Dorg.gradle.jvmargs="-Xmx2560m -XX:MaxMetaspaceSize=512m")
|
||||||
|
"${gradle[@]}" generateCodegenArtifactsFromSchema
|
||||||
|
"${gradle[@]}" assembleRelease -x lintVitalRelease
|
||||||
|
./gradlew --stop
|
||||||
|
|
||||||
- name: Свободное место после сбоя
|
- name: Диагностика сбоя (диск, память, OOM)
|
||||||
if: failure()
|
if: failure()
|
||||||
run: |
|
run: |
|
||||||
df -h / /tmp; free -m || true
|
df -h / /tmp; free -m || true
|
||||||
|
|||||||
+10
-1
@@ -5,9 +5,18 @@
|
|||||||
FROM node:22-alpine AS build
|
FROM node:22-alpine AS build
|
||||||
RUN npm install -g pnpm@11.9.0
|
RUN npm install -g pnpm@11.9.0
|
||||||
WORKDIR /repo
|
WORKDIR /repo
|
||||||
COPY . .
|
# Сначала только манифесты workspace: слой с установкой зависимостей пересобирается лишь при их изменении,
|
||||||
|
# а не при любой правке кода. Новый пакет в apps/ или packages/ — добавить его package.json сюда.
|
||||||
|
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
||||||
|
COPY apps/web/package.json apps/web/
|
||||||
|
COPY apps/mobile/package.json apps/mobile/
|
||||||
|
COPY packages/api-client/package.json packages/api-client/
|
||||||
|
COPY packages/core/package.json packages/core/
|
||||||
|
COPY packages/design-tokens/package.json packages/design-tokens/
|
||||||
|
COPY packages/i18n/package.json packages/i18n/
|
||||||
RUN --mount=type=cache,target=/root/.local/share/pnpm/store \
|
RUN --mount=type=cache,target=/root/.local/share/pnpm/store \
|
||||||
pnpm install --frozen-lockfile --filter @pipu/web...
|
pnpm install --frozen-lockfile --filter @pipu/web...
|
||||||
|
COPY . .
|
||||||
# Сгенерированные клиенты и токены лежат в репозитории (их актуальность проверяет CI), поэтому generate здесь не нужен.
|
# Сгенерированные клиенты и токены лежат в репозитории (их актуальность проверяет CI), поэтому generate здесь не нужен.
|
||||||
RUN pnpm --filter @pipu/web build
|
RUN pnpm --filter @pipu/web build
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,22 @@ C++-сборка React Native). APK собирается только под `ar
|
|||||||
кэш слоёв переживает job, и повторная сборка занимает секунды. Кэш растёт — на хосте раннера раз в сутки:
|
кэш слоёв переживает job, и повторная сборка занимает секунды. Кэш растёт — на хосте раннера раз в сутки:
|
||||||
`docker builder prune -af --filter until=72h` (см. [настройку раннера](#настройка-раннера)).
|
`docker builder prune -af --filter until=72h` (см. [настройку раннера](#настройка-раннера)).
|
||||||
|
|
||||||
|
### Кэши
|
||||||
|
|
||||||
|
| Что | Где кэшируется | Чем |
|
||||||
|
|---|---|---|
|
||||||
|
| pnpm store | все job с `pnpm install` | `setup-node` `cache: pnpm` (кэш actions раннера) |
|
||||||
|
| Go-модули и build cache | `api`, `contract` | `setup-go` |
|
||||||
|
| uv | `recommender` | `setup-uv` `enable-cache` |
|
||||||
|
| Результаты turbo (typecheck, test, build) | `ts` | `actions/cache` для `.turbo/cache` |
|
||||||
|
| `npx expo-doctor`, трансформации Metro | `mobile` | `actions/cache` для `~/.npm/_npx` и `/tmp/metro-cache` |
|
||||||
|
| Слои Docker и `--mount=type=cache` | `docker`, сборка на сервере | Docker хоста; манифесты копируются раньше кода |
|
||||||
|
| Gradle (дистрибутив, зависимости, build cache), Android SDK и NDK | `android` в `release.yml` | тома `/opt/ci-cache/*` |
|
||||||
|
| Node, Go, Java, скачанные setup-action'ами | все job | том `act-toolcache` раннера |
|
||||||
|
|
||||||
|
Кэш actions работает, только если он включён на раннере ([настройка](#настройка-раннера)); без него в логах
|
||||||
|
`Cache action is only supported on GHES…`, и всё скачивается заново.
|
||||||
|
|
||||||
## `release.yml` — по тегу
|
## `release.yml` — по тегу
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
|||||||
Reference in new issue
Block a user