📦 給 monorepo 前端/全棧團隊:在遠端 Mac CI上同時調 pnpm store、Turborepo remote cache、registry 鏡像與 --filter 並發;本文含命中率診斷、決策矩陣、可執行 .npmrc/turbo.json 參數表與磁碟水位 FAQ。內鏈:首頁、部落格列表、npm 快取策略、npm/Homebrew 避坑。

痛點:跨境拉取、快取鍵漂移與 remote 命中率失真

(一)僅靠本機 node_modules 快取,換到遠端 Mac 仍全量 pnpm install,pnpm store 未固定路徑導致 CI 快取還原錯位。(二)Turborepo remote cache 未綁 lockfile/Node 版,任務指紋變了卻仍命中舊產物。(三)registry 鏡像與 Git 鏡像混用不一致,跨境頻寬抖動時 worker 併發過高,磁碟 I/O 飽和拖垮 pipeline。

① 命中率診斷指標:先量再調

每條 pipeline 建議輸出:remote cache hit ratio、pnpm store 重用率、registry 回源比例,並在摘要保留七日移動平均以便對照調參成效。hit ratio 長期低於 40% 且下載字節仍高,先查快取鍵是否缺 pnpm-lock.yaml 雜湊;store 重用高但 turbo 仍 miss,查任務 inputs 是否把隨機 env 或時間戳寫進指紋。

指標健康閾值異常訊號優先動作
Remote hit ratio≥55%長期 <30%檢查 turbo 指紋與 token
Store 重用率≥70%每次全量下載固定 store-dir+預熱
磁碟可用≥25%iowait 飆升降 worker/清 store

② store-dir 與快取鍵設計

在倉庫根 .npmrc 固定 store,並以 lockfile 納入 CI 快取鍵:

# .npmrc(片段)
store-dir=/var/ci/pnpm-store
prefer-frozen-lockfile=true
fetch-retries=3
fetch-timeout=120000

export CACHE_KEY="pnpm$(pnpm -v)_$(shasum -a 256 pnpm-lock.yaml | cut -c1-12)"
pnpm install --frozen-lockfile

多作業 runner 宜一作業一 store 子目錄,或唯讀掛載預熱 store,避免並發寫壞索引。

③ 自建 remote cache 端點與 TLS

{
  "remoteCache": { "enabled": true, "signature": true },
  "tasks": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] } }
}

export TURBO_API="https://cache.internal.example.com"
export TURBO_TOKEN="${TURBO_REMOTE_TOKEN}"
export TURBO_TEAM="ci-macpull"
pnpm exec turbo run build --filter=...@origin/main --summarize

生產務必 HTTPS;自簽以 NODE_EXTRA_CA_CERTS 注入。token 僅能經 CI 祕文注入,切勿寫入版控。

④ registry/Git 鏡像組合

組合registryGit 依賴適用
A 企業內網Verdaccio/Nexus內網 Git 鏡像低延遲可審計
B 跨境加速區域 npm 鏡像淺克隆+bundle遠端 Mac 鄰近節點
C 混合公共鏡像+scope 回源git+https 固定 host開源依賴多
registry=https://registry.npmmirror.com
@myorg:registry=https://npm.corp.example/
git config --global url."https://mirror.corp.example/".insteadOf "https://github.com/"

詳見 Git/npm CI 加速 與 拉取穩定性 FAQ。

決策矩陣:頻寬 × 併發 × 快取層

場景pnpm 並發turbo 並發store/remote
穩定跨境--workspace-concurrency=680%預熱 store+remote 開
抖動頻寬450%先 install 再 turbo
磁碟吃緊22僅下載 remote;清 .turbo
PR 驗證frozen-lockfile--filter=...[origin/main]遠端讀多寫少

落地五步:從預熱到合併閘門

1

鎖 Node/pnpm:與 lockfile 一致;寫入快取鍵。

2

預熱 store:還原 store-dir;驗證 shasum。

3

install:pnpm install --frozen-lockfile;記錄下載字節。

4

turbo:--filter 縮範圍;開 --summarize 輸出命中率。

5

閘門:命中率或磁碟低於閾值則 fail;附參數快照。

可引用資訊

(一)快取鍵:pnpm{版}_{lock前12位}_{NODE_VERSION}。(二)抖動網路 fetch-timeout=120000、fetch-retries=3 為起點。(三)根分區可用 <20% 時自動降併發並告警。

⑤ 並發與磁碟水位 FAQ

Remote cache 命中率長期偏低?

查任務 inputs 是否含隨機 env;確認 TURBO_TOKEN 與 team 一致;lockfile 變更後允許一次冷啟動。

pnpm 與 turbo 同時拉高 worker 導致磁碟滿?

先限制 --workspace-concurrency,再設 turbo --concurrency=2;夜間清理 store 舊內容。

鏡像站與官方 registry 混用造成 hash 不一致?

同一分支固定單一 registry;合併前強制 --frozen-lockfile;必要時 scope 分流。

PR 只想跑變更套件?

使用 turbo run build --filter=...[origin/main];搭配遠端 cache 讀取縮短跨境時間。

總結:先量 pnpm store 與 Turborepo remote cache 命中率,再以 lockfile 綁快取鍵、TLS 保護自建端點,並用決策矩陣收斂跨境 registry 鏡像 與 worker。需要可預熱 store 的節點,可從 MacPull 首頁 選方案,並對照 npm/Homebrew 避坑文、購買頁 租用遠端 Mac CI 建置機(免登入)。

遠端 Mac × pnpm × Turborepo

租用 Apple Silicon 節點跑 monorepo CI

鄰近實體 Mac 利於 store 預熱與 remote cache 命中;搭配站內 npm 鏡像避坑文與定價說明,免登入即可下單。