diff --git a/.gitea/workflows/ci-mobile.yml b/.gitea/workflows/ci-mobile.yml index e8ae0ea..5cf5b13 100644 --- a/.gitea/workflows/ci-mobile.yml +++ b/.gitea/workflows/ci-mobile.yml @@ -39,5 +39,13 @@ jobs: - uses: actions/setup-node@v4 with: { node-version: "22", cache: pnpm } - 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 export --platform android --output-dir dist diff --git a/.gitea/workflows/ci-ts.yml b/.gitea/workflows/ci-ts.yml index a792ceb..f3175a9 100644 --- a/.gitea/workflows/ci-ts.yml +++ b/.gitea/workflows/ci-ts.yml @@ -40,6 +40,12 @@ jobs: - uses: actions/setup-node@v4 with: { node-version: "22", cache: pnpm } - 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 test:scripts - run: pnpm typecheck diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile index eb92000..db17c1d 100644 --- a/apps/web/Dockerfile +++ b/apps/web/Dockerfile @@ -5,9 +5,18 @@ FROM node:22-alpine AS build RUN npm install -g pnpm@11.9.0 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 \ pnpm install --frozen-lockfile --filter @pipu/web... +COPY . . # Сгенерированные клиенты и токены лежат в репозитории (их актуальность проверяет CI), поэтому generate здесь не нужен. RUN pnpm --filter @pipu/web build diff --git a/docs/ci-cd.md b/docs/ci-cd.md index 5a86046..4d1791e 100644 --- a/docs/ci-cd.md +++ b/docs/ci-cd.md @@ -39,6 +39,22 @@ C++-сборка React Native). APK собирается только под `ar кэш слоёв переживает job, и повторная сборка занимает секунды. Кэш растёт — на хосте раннера раз в сутки: `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` — по тегу ```yaml