给在远程 Mac上跑 Gradle / Maven(含 Android、后端多模块)CI 的维护者:跨境拉依赖最怕元数据半包、缓存串线、并行把磁盘打满。本文用决策矩阵 + 可执行参数清单讲清:选镜像还是私服前置、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
# 远程 Mac CI:Gradle(zsh/bash) export GRADLE_USER_HOME="${HOME}/.gradle-ci-${CI_PIPELINE_ID:-local}" mkdir -p "$GRADLE_USER_HOME" ./gradlew --no-daemon --parallel --max-workers=4 clean test # Maven:独立本地仓 mvn -T 1C -Dmaven.repo.local="${HOME}/.m2-ci-${CI_PIPELINE_ID:-local}/repository" clean verify

④ 并行阈值:--parallelmax-workers 与 Maven -T

共享 Apple Silicon 远程机构建机时,先把worker 上限钉死,再观察磁盘 util 与网络错误率;独占节点再放宽。

  • Gradleorg.gradle.parallel=trueorg.gradle.workers.maxmin(4, floor(物理核×0.75)) 作共享机起点,独占可到 68。命令行等价:./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 平台默认短超时误杀。

落地五步(HowTo 对齐)
  • 为每 Job 导出独立 GRADLE_USER_HOMEmaven.repo.local
  • gradle.properties 增加 systemProp.org.gradle.internal.http.connectionTimeout=120000socketTimeout=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 指纹、镜像主机名。
# gradle.properties 片段(放入 GRADLE_USER_HOME) systemProp.org.gradle.internal.http.connectionTimeout=120000 systemProp.org.gradle.internal.http.socketTimeout=120000 org.gradle.parallel=true org.gradle.workers.max=4

⑥ FAQ 与结论(结构化数据见页头 JSON-LD)

正文 FAQ 与 FAQPage / HowTo 已对齐:覆盖缓存损坏、Maven -T 过高变慢、Android 与镜像共存三类高频问题。

总结:2026 年在远程 Mac 跑 JVM CI,请按私服优先 → 目录隔离 → 并行封顶 → 超时 + 三次指数退避顺序收敛问题。需要 Apple Silicon 节点做同构构建时,可免登录打开 MacPull 首页 了解产品,在 远程 Mac 套餐购买页 选型下单,并在 帮助中心 查看 SSH 连接与终端登录说明后再接入流水线。

远程 Mac · Gradle / Maven CI

先稳住拉依赖,再谈编译提速

以下页面均可免登录浏览:从 首页 了解 MacPull,到 套餐购买页 选择节点,再在 帮助中心 按「SSH 连接」类文档完成终端接入。

Apple Silicon
SSH 终端
弹性租期
7×24 支持