store-dir、turbo.json、--filter 与并发 worker),覆盖命中率诊断、缓存键、自建端点 TLS 与磁盘水位 FAQ。延展:npm/Homebrew 镜像避坑、拉取稳定性 FAQ;博客列表、首页、购买页。
痛点拆解:为何远程 Mac 上 monorepo CI 总「假绿」
① store 与 turbo 缓存键脱节:只缓存 node_modules 却未固定 pnpm store-dir,换 Job 即全量重装,磁盘 I/O 成为瓶颈。② 跨境 remote cache 空命中:本地命中、CI 未上传,或 TURBO_TOKEN 与 team 不一致,矩阵构建时间被拉长数倍。③ registry 与 Git 混源未分键:workspace: 与 git 依赖走不同通道,registry 镜像升级后仍拉旧 tarball。④ 并发 worker 与带宽不匹配:network-concurrency 与 turbo --concurrency 在跨境链路上过高,触发四二九与 store 损坏重试。
命中率诊断指标:pnpm store 与 Turborepo remote cache
| 指标 | 健康阈值 | 采集方式 | 异常含义 |
|---|---|---|---|
| pnpm 重复安装率 | < 15% | pnpm store path 体积环比 |
store-dir 未持久或锁文件漂移 |
| Turbo 远程命中率 | ≥ 55%(lint/test) | turbo run --summarize |
签名未含 lockfile/Node 主版本 |
| registry 拉取 P95 | < 45s(跨境) | CI 步骤计时 + 镜像 URL 标签 | 需换 registry 镜像 或降并发 |
store-dir 与缓存键设计(.npmrc / CI 环境变量)
在远程 Mac 上将 pnpm store 与 Job 解耦,缓存键绑定锁文件与 Node 主版本:
勿与 Turborepo 输出目录混用;turbo.json 的 globalDependencies 应包含 pnpm-lock.yaml 与 .npmrc。
自建 Turborepo remote cache 端点与 TLS
端点须 TLS 1.2+ 且证书链可被远程 Mac 信任;自建 S3/MinIO 兼容 API 时开启签名与对象生命周期,防止磁盘被旧 artifact 撑满。
上传失败时勿静默降级为仅本地缓存:应在 CI 门禁中检查 turbo run 摘要里的 remote cache hit rate,低于团队阈值即失败,避免「假绿」合并。
registry / Git 镜像组合决策矩阵
| 场景 | npm/registry | Git 依赖 | 推荐并发 |
|---|---|---|---|
| 纯 npm 私服 | 公司 Verdaccio/Nexus | — | network-concurrency 8 |
| monorepo + git 子包 | 镜像 + lockfile 门禁 | Git 镜像 / bundle | install 与 turbo 分 Job |
| 跨境 远程 Mac CI | 同区域 registry 镜像 | 禁止与 npm 共缓存键 | 并发降为 4,见拉取 FAQ 文 |
落地步骤:远程 Mac CI 五步法
- ① 固定 Node/pnpm 版本并写入 Job 摘要。
- ② 配置
store-dir与 CI 缓存键(含 lockfile 哈希)。 - ③ 启用自建 Turborepo remote cache 与
TURBO_TOKEN。 - ④
pnpm install --frozen-lockfile后turbo run --filter=...。 - ⑤ 导出 summarize JSON,命中率低于阈值则 fail 并告警。
可引用信息(值班粘贴块)
- 缓存键:pnpm-lock 哈希 + Node 主版本 + registry URL + TURBO_TEAM。
- 并发:跨境默认
--concurrency=50%、network-concurrency=4;磁盘 <20GB 再减半。 - filter 示例:
turbo run build --filter=@app/web...仅构建受影响包。 - worker 上限:M4 八核建议
turbo --concurrency=6,install 阶段单独 Job 不占编译核。
并发与磁盘水位 FAQ
remote cache 命中率长期低于 40%?
核对 turbo 签名是否含 lockfile;确认 CI 与本地同一 TURBO_TOKEN;跨境优先同区域自建端点。
pnpm store 与 turbo 缓存能否同目录?
不建议。store 存包内容,turbo 存任务输出;分目录并分别纳入 CI 缓存键。
磁盘水位多少应降并发?
可用空间低于 20GB 时,将 pnpm network-concurrency 降为 4、turbo --concurrency 降为 50%。
registry 与 Git 如何组合?
npm 包走 registry 镜像,git 依赖走 Git 镜像;缓存键分别记录 URL 与 remote 指纹。详见 Git/npm CI 缓存策略文。