Кому: monorepo frontend и full-stack, которые запускают pnpm и Turborepo на удалённом Mac CI через трансграничный канал.

Результат: метрики hit rate, ключи pnpm store-dir и remote cache, стеки registry-зеркал и таблицы worker для вставки в pipeline.

Структура: три риска, матрица решений, исполняемые параметры, шесть шагов runbook, цифры для дизайн-дока, FAQ. См. главную, блог, зеркала npm и Homebrew.

Три типичных промаха при наивном кеше monorepo:

  1. Общий store-dir без ключей. Один глобальный pnpm store на все джобы отравляет content-addressable попадания при разных Node major или lockfile.
  2. Remote cache раньше локального store. Turborepo грузит артефакты, пока pnpm install ещё тянет tarball по нестабильному WAN — hit rate «красивый», wall time растёт.
  3. Registry и Git в одной полосе. Высокий network-concurrency плюс четыре Turbo worker насыщают APFS и дают ETIMEDOUT на трансграничных pull.

Удалённый Mac CI: диагностические метрики hit rate для pnpm store и Turborepo

Логируйте на каждой lane пула Apple Silicon:

МетрикаЦельДействие при отклонении
Повторное использование pnpm store> 85 % после frozen installПроверить store-dir, зеркало registry, ключ CI
Turbo remote hits> 60 % cacheable tasks на mainВыровнять TURBO_TOKEN, teamId, signature
Минуты pull< 8 мин от fetch до первого turbo runСнизить concurrency, включить bundle Git
Принцип: не поднимайте turbo run --concurrency, пока pnpm store не стабилен — иначе remote cache кеширует «пустые» прогоны.

pnpm store-dir и дизайн ключей кеша на удалённом Mac CI

Изолируйте store на lane; включайте Node major в ключ CI при смене toolchain.

# .npmrc (корень репо или генерируется в CI)
store-dir=/var/ci/pnpm-store-${JOB_ID:-lane}
shamefully-hoist=false
fetch-timeout=120000
network-concurrency=4
registry=https://registry.npmmirror.com/
ПараметрЗначение CIНазначение
store-dir/var/ci/pnpm-store-$JOB_IDБез pool-wide store
Ключ кешаsha256(pnpm-lock.yaml)+Node+darwin-arm64Детерминированный restore
--filterweb... / !docsУзкий граф turbo

См. стратегию кеша Git и npm.

Self-hosted Turborepo remote cache: endpoint, TLS и turbo.json

{
  "$schema": "https://turbo.build/schema.json",
  "remoteCache": {
    "enabled": true,
    "signature": true,
    "teamId": "team_macpull_ci",
    "apiUrl": "https://turbo-cache.internal:443"
  }
}

Храните TURBO_TOKEN в секретах; завершайте TLS на шлюзе; ротируйте токен ежеквартально. Не смешивайте каталог Turbo cache с pnpm store.

Комбинации registry-зеркала и Git-зеркала для трансграничных pull

Разводите артефакты по транспорту: npm — зеркала npm и Homebrew; git-зависимости — Git bundle и shallow; соседний стек — матрица Yarn Berry. Ключ кеша должен включать URL registry и fingerprint Git remote.

Матрица решений: pnpm store, Turborepo remote cache, registry, worker

Профиль WAN pnpm store-dir Turbo remote Registry turbo workers
RTT < 80 ms На JOB_ID, NVMe Self-hosted TLS Региональное npm-зеркало 4 worker, --filter
Потери 120–200 ms Прогретый store, concurrency 2 signature + async upload npmmirror + Git bundle 2 worker, network-concurrency 4
Нестабильный канал Prefetch store tarball Read-mostly remote Корпоративный proxy 1 worker, serial fetch

Шесть шагов runbook: install, прогрев store, turbo run

  1. Закрепите Node через corepack; коммитьте pnpm-lock.yaml.
  2. Запишите .npmrc store-dir и registry; pnpm install --frozen-lockfile.
  3. Restore CI-кеш по lockfile + Node major; pnpm store status в артефакт.
  4. Экспортируйте TURBO_TOKEN; проверьте HTTPS у remoteCache.apiUrl.
  5. turbo run с --filter и --concurrency=2; повышайте после зелёных метрик.
  6. Прервите job при < 30 ГБ свободно; см. FAQ стабильности pull.
pnpm install --frozen-lockfile
pnpm store status | tee store.log
turbo run lint build test --filter=web... --summarize \
  --concurrency="${TURBO_CONCURRENCY:-2}"

Цифры для дизайн-дока и цитирования

  • Размер прогретого pnpm store: 4–12 ГБ на lane M4 NVMe; ключ — хеш pnpm-lock.yaml.
  • Payload Turbo remote: типично 2–80 МБ на задачу; включайте signature против отравленных артефактов.
  • Порог диска: прерывайте install при < 30 ГБ свободно на общем Mac Studio.

FAQ: concurrency, --filter и пороги диска на удалённом Mac CI

Какой hit rate pnpm store перед Turbo remote?

Цель 85 % на прогретой lane; ниже 70 % — исправьте store-dir или смесь Node. Не делите store между major без отдельного ключа.

Сколько worker на трансграничном канале?

Старт с двух; до четырёх при hit rate > 60 % и > 30 ГБ на APFS. См. FAQ пула и диска.

Обязателен ли TLS для remote cache?

Да на общих сетях: TLS на шлюзе, remoteCache.signature, ротация TURBO_TOKEN.

Итог: арендуйте удалённый Mac CI-узел под pnpm и Turborepo

Monorepo CI выигрывает, когда store-dir, registry-зеркала и self-hosted remote cache используют одну историю ключей. Сравните тарифы на главной, прочитайте обходные пути npm-зеркал, затем арендуйте NVMe-узел MacPull в регионе registry. Без входа: покупка, тарифы, блог CI.

Аренда Mac Mini M4 под pnpm monorepo и Turborepo CI

store на lane, TLS remote cache и registry-зеркала — сравните тарифы без обязательного входа.