痛点:越境 monorepo CI で起きやすい三つの律速
pnpm storeの鍵が粗く、pnpm-lock.yaml と Node 版がジョブ間で混線し tarball が毎回再取得されます。
Turborepo remote cacheの hash 入力に OS や環境変数差があり、越境 runner で hit がゼロに近づきます。
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 hit | turbo 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 store | lock ハッシュ+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 プールに分けると切り分けが速くなります。
| 組み合わせ | registry | Git | worker 目安 |
|---|---|---|---|
| 保守 | 単一ミラー | SSH ミラー 1 本 | turbo --concurrency=4 |
| 中庸 | npm + GitHub Packages | HTTPS+トークン | --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 → 検収)
Node 版と corepack enable を固定し、要約に node -v と pnpm -v を書き出します。
store-dir を専用ボリュームにし、CI キャッシュキーに lock ハッシュを載せます。
pnpm install --frozen-lockfile の後、turbo run で remote cache を有効化します。
--filter と --concurrency を表から選び、429 時は四から九十秒退避を入れます。
空き容量と 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 ミラー避坑と併用してください。
専用ノードで monorepo CI の store と remote cache を固定
Apple Silicon 上で pnpm store と TLS 付き remote cache を安定運用できます。