monorepo をリモート Mac CIで回す前端・全栈チーム向けです。pnpm storeとTurborepo remote cacheの越境命中率が低いと、install と turbo が毎回フル実行になります。本文は命中率診断指標・store-dir とキャッシュ鍵・TLS 付き remote cache・registry/Git ミラー・並列 worker とディスク水位の決定表と実行パラメータです。ホーム・技術ブログ一覧・npm/Homebrew ミラー避坑と併読ください。

痛点:越境 monorepo CI で起きやすい三つの律速

1

pnpm storeの鍵が粗く、pnpm-lock.yaml と Node 版がジョブ間で混線し tarball が毎回再取得されます。

2

Turborepo remote cacheの hash 入力に OS や環境変数差があり、越境 runner で hit がゼロに近づきます。

3

registry ミラーと Git の二系統認証が未分離だと 429 が続き、install は緑でも後段の turbo run だけ赤になります。

① 命中率診断指標:pnpm install と turbo cache hit を同じダッシュボードへ

越境リモート Mac CIでは「速い/遅い」より再現可能な hit 率を先に固定します。ジョブ要約に次の四指標を載せ、週次で閾値を見ます。

指標計測方法越境の目安改善レバー
install 時間pnpm i --frozen-lockfile の wall前週比 ±15% 以内store-dir・ミラー
remote cache hitturbo run ログの cache 行≥60%(安定後)hash 入力・TLS 端点
registry 429 率install ログの HTTP 429<2%並列・退避
空き容量df -g on store ボリューム警告 30GB/停止 15GB水位・ジョブ上限

② store-dir とキャッシュ鍵設計:.npmrc と CI 成果物名

pnpm storeは runner ローカル SSD に置き、復元キーは lockfile と Node 版とアーキテクチャで切ります。テナント共有 Mac では store を混ぜません。

# .npmrc(リポジトリ直下・CI とローカルで同一)
store-dir=/var/ci/pnpm-store/v3
registry=https://registry.npmmirror.com
network-concurrency=12
child-concurrency=4
fetch-timeout=120000
fetch-retries=3
fetch-retry-mintimeout=4000
fetch-retry-maxtimeout=90000

@myorg:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${GITHUB_PACKAGES_TOKEN}
キャッシュ層鍵の素子避けること
pnpm storelock ハッシュ+Node 版+arm64ブランチ名のみ
node_modules同上(hoist 方針込み)未ロック install
turbo ローカルTURBO_TEAM+hash未設定の env 混在

③ 自建 remote cache 端点と TLS:turbo.json とシークレット

越境では Vercel 既定 CDN より自社リージョンの cache サーバが hit 安定しやすいです。TLS 終端とトークン輪替を Runbook に載せます。

// turbo.json 抜粋
{
  "$schema": "https://turbo.build/schema.json",
  "remoteCache": { "enabled": true },
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**"],
      "env": ["NODE_ENV", "NEXT_PUBLIC_*"]
    },
    "lint": { "outputs": [] }
  }
}

export TURBO_API="https://turbo-cache.internal.example:443"
export TURBO_TOKEN="${TURBO_CACHE_RW_TOKEN}"
export TURBO_TEAM="prod-monorepo"

TLS は社内 CA または公開証明書を明示し、NODE_EXTRA_CA_CERTS を runner イメージに焼き込みます。トークンは read と write を分離し、輪替期間は二トークン併存を一パイプラインサイクル確保します。

④ registry/Git ミラー組み合わせと --filter・worker 並列

npm と Git を別表で固定し、turbo run build --filter=...@scope/pkg でジョブ分割します。越境跨境拉取は install と turbo を別 runner プールに分けると切り分けが速くなります。

組み合わせregistryGitworker 目安
保守単一ミラーSSH ミラー 1 本turbo --concurrency=4
中庸npm + GitHub PackagesHTTPS+トークン--concurrency=8
攻め地域ミラー+上流フォールバックbundle 併用専用プールのみ 12
pnpm config set store-dir "$CI_PNPM_STORE"
pnpm install --frozen-lockfile --prefer-offline

turbo run lint test build \
  --filter='...[origin/main]' \
  --concurrency=8 \
  --summarize

ミラー詳細は 越境 Git/npm/Homebrew 最適化・Yarn Berry 決定表を参照してください。

リモート Mac への五手順(install → remote cache → 検収)

1

Node 版と corepack enable を固定し、要約に node -v と pnpm -v を書き出します。

2

store-dir を専用ボリュームにし、CI キャッシュキーに lock ハッシュを載せます。

3

pnpm install --frozen-lockfile の後、turbo run で remote cache を有効化します。

4

--filter と --concurrency を表から選び、429 時は四から九十秒退避を入れます。

5

空き容量と hit 率を要約 JSON に載せ、閾値未満ならジョブを fail します。

⑤ 並列とディスク水位 FAQ

Turborepo の cache hit がゼロに近いです。
remoteCache.enabled、TURBO_TEAM、環境変数の差分、--filter 範囲を確認し、hash 入力に OS と Node 版を含めてください。
pnpm store がジョブ間で汚染されます。
store-dir をテナント単位に分離し、復元キーに pnpm-lock.yaml のダイジェストと Node 版を必ず含めてください。
registry ミラーで 429 が続きます。
network-concurrency と turbo worker を下げ、四から九十秒の段階退避を入れ、GitHub Packages 認証を npm 本体と分離してください。

まとめ:リモート Mac CI ノードで monorepo を分離運用

pnpm store・Turborepo remote cache・registry ミラーを一枚の決定表に固定すると、越境 runner の再現性が上がります。

転記用の値(可引用)
  • store-dir=専用 SSD/鍵=lock 先頭十六桁+Node 版+arm64
  • 越境並列:pnpm network-concurrency 12・turbo --concurrency 8 から
  • ディスク:警告 30GB/停止 15GB・429 退避 4→12→30→90 秒

ホーム・料金・購入・ヘルプはログイン不要です。専用のリモート Mac CI ノードで install と turbo を分離し、npm/Homebrew ミラー避坑と併用してください。

pnpm × Turborepo × リモート Mac CI

専用ノードで monorepo CI の store と remote cache を固定

Apple Silicon 上で pnpm store と TLS 付き remote cache を安定運用できます。