--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 鏡像組合
| 組合 | registry | Git 依賴 | 適用 |
|---|---|---|---|
| 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=6 | 80% | 預熱 store+remote 開 |
| 抖動頻寬 | 4 | 50% | 先 install 再 turbo |
| 磁碟吃緊 | 2 | 2 | 僅下載 remote;清 .turbo |
| PR 驗證 | frozen-lockfile | --filter=...[origin/main] | 遠端讀多寫少 |
落地五步:從預熱到合併閘門
鎖 Node/pnpm:與 lockfile 一致;寫入快取鍵。
預熱 store:還原 store-dir;驗證 shasum。
install:pnpm install --frozen-lockfile;記錄下載字節。
turbo:--filter 縮範圍;開 --summarize 輸出命中率。
閘門:命中率或磁碟低於閾值則 fail;附參數快照。
可引用資訊
(一)快取鍵:pnpm{版}_{lock前12位}_{NODE_VERSION}。(二)抖動網路 fetch-timeout=120000、fetch-retries=3 為起點。(三)根分區可用 <20% 時自動降併發並告警。
⑤ 並發與磁碟水位 FAQ
查任務 inputs 是否含隨機 env;確認 TURBO_TOKEN 與 team 一致;lockfile 變更後允許一次冷啟動。
先限制 --workspace-concurrency,再設 turbo --concurrency=2;夜間清理 store 舊內容。
同一分支固定單一 registry;合併前強制 --frozen-lockfile;必要時 scope 分流。
使用 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 鏡像避坑文與定價說明,免登入即可下單。