GRADLE_USER_HOME 与 ~/.m2 怎么隔、--parallel / max-workers / -T 上界,以及超时与指数退避重试。内链:MacPull 首页、技术博客列表、Go Modules 跨境拉取矩阵(JVM 与 Go 混栈团队可对照网络策略)💻🚀
① 痛点拆解:共享远程 Mac 上 Gradle / Maven 为何总「偶发」失败
1 多 Job 共写同一 ~/.gradle/caches 或 ~/.m2/repository,metadata 与 jar 可能出现半写入,解析结果随机漂移。2 直连海外中心仓时 TLS 握手与 POM 校验在弱网下超时,错误往往表现为「Checksum failed」或 hung 在 metadata。3 为提速盲目拉高并行,反而让 HDD/网络成为瓶颈,全员进入重试风暴。下面先给镜像端点对比,再落到目录与线程阈值。
② 镜像与仓库端点对比表(Maven 依赖 / 插件 / Android)
下列 URL 为常见公共端点示例,生产应优先走企业 Nexus / Artifactory 统一代理;若无私服,再按地域选镜像并拆分「依赖仓」与「插件仓 / Google 专用仓」,避免一刀切 mirrorOf=* 把 Android 依赖挡掉。
| 端点类型 | 示例 URL | 适用场景 | 注意 |
|---|---|---|---|
| Maven Central | https://repo1.maven.org/maven2/ |
标准 Java 依赖基线 | 跨境直连延迟高 |
| 阿里云公共 | https://maven.aliyun.com/repository/public |
大陆访问 Central 聚合 | 需确认与企业制品策略一致 |
| 腾讯云 / 华为云 Maven | 各云厂商文档提供的 .../maven/ |
已用同云 VPC 的团队 | 与私服并存时排好 mirror 顺序 |
| Gradle Plugin Portal | https://plugins.gradle.org/m2 |
Gradle 插件解析 | 建议单独 repository 块,勿与依赖混 mirror |
| Google Maven | https://dl.google.com/dl/android/maven2/ |
AndroidX / Play 服务 | 镜像未同步时勿 mirror 覆盖 |
若出口必须走 HTTP 代理,记得为内网 Nexus 配 NO_PROXY,并把 JVM 的 HTTPS_PROXY 与 Gradle/Maven 超时对齐,避免「直连内网却被代理截胡」的假死。
③ 缓存路径清单:GRADLE_USER_HOME、M2 与 CI 隔离命名
| 项 | 默认 / 推荐 | 说明 |
|---|---|---|
GRADLE_USER_HOME |
$HOME/.gradle → CI 改为 $HOME/.gradle-ci-$RUN_ID |
含 caches/、daemon/、wrapper 发行版 |
| 依赖物化目录 | $GRADLE_USER_HOME/caches/modules-2 |
缓存键应含 distributionUrl 与 settings 指纹 |
| Maven 本地仓 | ~/.m2/repository |
用 mvn -Dmaven.repo.local=$HOME/.m2-ci-$RUN_ID/repository |
④ 并行阈值:--parallel、max-workers 与 Maven -T
共享 Apple Silicon 远程机构建机时,先把worker 上限钉死,再观察磁盘 util 与网络错误率;独占节点再放宽。
- Gradle:
org.gradle.parallel=true;org.gradle.workers.max取min(4, floor(物理核×0.75))作共享机起点,独占可到6–8。命令行等价:./gradlew --parallel --max-workers=4。 - Maven:优先
-T 1C(每核一线程)或-T 2;仅在 SSD + 私服命中高时试-T 4,且不超过CPU 核数的一半。 - 可引用阈值:共享机 Gradle
max-workers≤4;Maven 共享机-T≤2;独占机再按监控 +10% 步进。
⑤ 超时、重试与退避:gradle.properties / Maven / Shell 包装
弱网下先拉长单次读超时,再用有限次指数退避包裹整条任务,避免 CI 平台默认短超时误杀。
- 为每 Job 导出独立
GRADLE_USER_HOME与maven.repo.local。 gradle.properties增加systemProp.org.gradle.internal.http.connectionTimeout=120000与socketTimeout=120000(毫秒,可按制品体积加到180000)。- Maven
settings.xml配置 Wagon / Resolver 超时(如aether.connector.requestTimeout),与私服网关 idle 时间对齐。 - Shell 包装:
for i in 1 2 3; do ./gradlew … && break; sleep $((2**i)); done,三次失败再非零退出。 - 缓存归档键包含:wrapper 发行版哈希、主要 BOM 版本、
settings.gradle/pom.xml指纹、镜像主机名。
⑥ FAQ 与结论(结构化数据见页头 JSON-LD)
正文 FAQ 与 FAQPage / HowTo 已对齐:覆盖缓存损坏、Maven -T 过高变慢、Android 与镜像共存三类高频问题。
总结:2026 年在远程 Mac 跑 JVM CI,请按私服优先 → 目录隔离 → 并行封顶 → 超时 + 三次指数退避顺序收敛问题。需要 Apple Silicon 节点做同构构建时,可免登录打开 MacPull 首页 了解产品,在 远程 Mac 套餐购买页 选型下单,并在 帮助中心 查看 SSH 连接与终端登录说明后再接入流水线。