遠端 Mac跑 Android/後端流水線時,gradlemvn 常因跨境 RTT、同節點多 job 搶頻寬、快取目錄權限而拖垮整段構建。本文以決策矩陣對照私服與公共鏡像,附鏡像端點對照表GRADLE_USER_HOME.m2 路徑、--parallelmaxWorkersmvn -T 閾值,以及逾時與指數退避重試建議。內鏈:技術部落格列表Go Modules 跨境拉取矩陣MacPull 首頁

① 痛點與決策矩陣:私服鏡像 vs 公共倉

痛點歸納:(1)預設逾時偏短,晚高峰易集體失敗;(2)--parallel-T 過高會放大同時下載,磁碟 iowait 與頻寬飽和;(3)多人共用節點若 GRADLE_USER_HOME.m2 權限或清理腳本不一致,易出現「半寫入」快取。

方案最適場景維運與風險設定落點
企業私服(Nexus/Artifactory)需審計出站、內部構件與公開座標並存、要統一憑證需儲存與清理政策;單點故障要備援上游Maven settings.xml mirror;Gradle init.gradledependencyResolutionManagement
公共鏡像(區域/雲廠商)無內網倉、想快速在 CI 落地SLA 與同步延遲;須合規評估域名同上,鏡像 URL 替換為組織核准端點
混合公開座標走鏡像,內部 groupId 走私服兩套路由要文件化,避免誤打到公網私服規則優先,其餘 fallback 公共

② 鏡像端點對照(請替換為貴司核准 URL)

上游類型典型端點示例適用說明
Maven Centralhttps://repo.maven.apache.org/maven2預設座標最全;跨境時建議前置區域鏡像或私服拉取
Google Maven(Android)https://maven.google.comAndroidX/Play 服務等;與 Central 分開配置
Gradle Plugin Portalhttps://plugins.gradle.org/m2社群插件解析;企業環境可經私服代理
阿里雲等公共鏡像https://maven.aliyun.com/repository/public(示例)區域延遲較低;需確認與 Central 同步與合規

③ 本地快取目錄:GRADLE_USER_HOME 與 M2

工具環境變數/路徑主要快取子目錄CI 建議
GradleGRADLE_USER_HOME(預設 ~/.gradlecaches/modules-2caches/jars-*指向掛卷如 /var/cache/gradle-ci,快取鍵含 wrapper 版本與鎖檔雜湊
Maven~/.m2/repositorysettings.xml localRepositoryGAV 路徑樹固定同一使用者 uid,避免與互動登入混用目錄

④ CI 併發:--parallel、workers 與 mvn -T 閾值

原則:下載密集型階段先限流,再在編譯/測試階段放寬。共享遠端 Mac 上勿讓 workers 總和超過實體 CPU 核心,並預留系統與其他 job。

工具參數建議閾值(經驗)備註
Gradle--parallelorg.gradle.parallel=true4~8 核機:可開;2 核:謹慎或關閉org.gradle.workers.max 一併評估
Gradleorg.gradle.workers.max設為實體核心數核心數減一;多 job 同機再下修Android 大型專案常配合 JVM heap 監控
Mavenmvn -T 1C-T 21C 依 CPU 自動;共享節點可先 -T 2 試探 iowait與 Surefire 並行 fork 疊加時注意總執行緒數

⑤ 落地步驟(可複製到 runbook)

1

鏡像:settings.xmlinit.gradle 寫死核准端點;內網倉放首位,失敗再回退公共(若政策允許)。

2

快取:匯出 GRADLE_USER_HOME 與 Maven localRepository 到掛卷;CI 快取鍵綁定 gradle-wrapper.propertiespom.xml 或鎖檔雜湊。

3

併發:依核心數設定 workers 與 -T;觀察 iostat 與構建日誌中下載重疊度再微調。

4

逾時:Gradle 可設 systemProp.org.gradle.internal.http.connectionTimeoutsocketTimeout(建議120000 ms 級);Maven 使用 maven.wagon.http.connectionTimeout 等(同量級)。

5

重試:依賴步外包 3~5 次 job 級重試;退避 2s/4s/8s 指數增長,單次上限 60s,避免無限轟炸上游。

# 遠端 Mac/CI(bash)— 示例
export GRADLE_USER_HOME="${GRADLE_USER_HOME:-/var/cache/gradle-ci}"
export MAVEN_OPTS="${MAVEN_OPTS:--Dmaven.wagon.http.connectionTimeout=120000 -Dmaven.wagon.http.readTimeout=120000}"
./gradlew --parallel build
# 或:mvn -T 1C -B clean verify

可引用閾值:(1)HTTP 逾時120s 起跳再依 trace 調整;(2)退避序列2/4/8 秒;(3)共享節點 Gradle workers.max 建議不大於實體核心數

⑥ 簡短 FAQ

為什麼開了 parallel 反而更慢?

同時解析與下載會放大隨機 I/O 與網路競爭;請先降 workers 或分拆「依賴下載」與「編譯」步,再觀察快取是否命中。

Maven 與 Gradle 能共用同一個 .m2 當 Gradle 快取嗎?

不建議混用目錄結構;Gradle 模組快取在 GRADLE_USER_HOME,與 Maven 本地庫分離較易治理與清理。

2026遠端 Mac上跑 Gradle/Maven CI:先依矩陣選私服或公共鏡像,固定 GRADLE_USER_HOME.m2,用核心數封頂 workersmvn -T,並以120s 級逾時+2/4/8 秒退避包住依賴步。下一步請瀏覽免登入頁面:MacPull 首頁遠端 Mac 套餐購買說明中心(SSH/連線)

遠端 Mac × Java 依賴拉取

固定快取與併發閾值,穩定跨境構建

以下連結皆為站內免登入頁面:首頁了解節點、購買套餐、說明中心查 SSH/連線步驟。