gradle/mvn 常因跨境 RTT、同節點多 job 搶頻寬、快取目錄權限而拖垮整段構建。本文以決策矩陣對照私服與公共鏡像,附鏡像端點對照表、GRADLE_USER_HOME/.m2 路徑、--parallel/maxWorkers 與 mvn -T 閾值,以及逾時與指數退避重試建議。內鏈:技術部落格列表、Go Modules 跨境拉取矩陣、MacPull 首頁。
① 痛點與決策矩陣:私服鏡像 vs 公共倉
痛點歸納:(1)預設逾時偏短,晚高峰易集體失敗;(2)--parallel 或 -T 過高會放大同時下載,磁碟 iowait 與頻寬飽和;(3)多人共用節點若 GRADLE_USER_HOME/.m2 權限或清理腳本不一致,易出現「半寫入」快取。
| 方案 | 最適場景 | 維運與風險 | 設定落點 |
|---|---|---|---|
| 企業私服(Nexus/Artifactory) | 需審計出站、內部構件與公開座標並存、要統一憑證 | 需儲存與清理政策;單點故障要備援上游 | Maven settings.xml mirror;Gradle init.gradle 或 dependencyResolutionManagement |
| 公共鏡像(區域/雲廠商) | 無內網倉、想快速在 CI 落地 | SLA 與同步延遲;須合規評估域名 | 同上,鏡像 URL 替換為組織核准端點 |
| 混合 | 公開座標走鏡像,內部 groupId 走私服 | 兩套路由要文件化,避免誤打到公網 | 私服規則優先,其餘 fallback 公共 |
② 鏡像端點對照(請替換為貴司核准 URL)
| 上游類型 | 典型端點示例 | 適用說明 |
|---|---|---|
| Maven Central | https://repo.maven.apache.org/maven2 | 預設座標最全;跨境時建議前置區域鏡像或私服拉取 |
| Google Maven(Android) | https://maven.google.com | AndroidX/Play 服務等;與 Central 分開配置 |
| Gradle Plugin Portal | https://plugins.gradle.org/m2 | 社群插件解析;企業環境可經私服代理 |
| 阿里雲等公共鏡像 | https://maven.aliyun.com/repository/public(示例) | 區域延遲較低;需確認與 Central 同步與合規 |
③ 本地快取目錄:GRADLE_USER_HOME 與 M2
| 工具 | 環境變數/路徑 | 主要快取子目錄 | CI 建議 |
|---|---|---|---|
| Gradle | GRADLE_USER_HOME(預設 ~/.gradle) | caches/modules-2、caches/jars-* | 指向掛卷如 /var/cache/gradle-ci,快取鍵含 wrapper 版本與鎖檔雜湊 |
| Maven | ~/.m2/repository 或 settings.xml localRepository | GAV 路徑樹 | 固定同一使用者 uid,避免與互動登入混用目錄 |
④ CI 併發:--parallel、workers 與 mvn -T 閾值
原則:下載密集型階段先限流,再在編譯/測試階段放寬。共享遠端 Mac 上勿讓 workers 總和超過實體 CPU 核心,並預留系統與其他 job。
| 工具 | 參數 | 建議閾值(經驗) | 備註 |
|---|---|---|---|
| Gradle | --parallel、org.gradle.parallel=true | 4~8 核機:可開;2 核:謹慎或關閉 | 與 org.gradle.workers.max 一併評估 |
| Gradle | org.gradle.workers.max | 設為實體核心數或核心數減一;多 job 同機再下修 | Android 大型專案常配合 JVM heap 監控 |
| Maven | mvn -T 1C 或 -T 2 | 1C 依 CPU 自動;共享節點可先 -T 2 試探 iowait | 與 Surefire 並行 fork 疊加時注意總執行緒數 |
⑤ 落地步驟(可複製到 runbook)
鏡像:在 settings.xml/init.gradle 寫死核准端點;內網倉放首位,失敗再回退公共(若政策允許)。
快取:匯出 GRADLE_USER_HOME 與 Maven localRepository 到掛卷;CI 快取鍵綁定 gradle-wrapper.properties/pom.xml 或鎖檔雜湊。
併發:依核心數設定 workers 與 -T;觀察 iostat 與構建日誌中下載重疊度再微調。
逾時:Gradle 可設 systemProp.org.gradle.internal.http.connectionTimeout/socketTimeout(建議120000 ms 級);Maven 使用 maven.wagon.http.connectionTimeout 等(同量級)。
重試:依賴步外包 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
同時解析與下載會放大隨機 I/O 與網路競爭;請先降 workers 或分拆「依賴下載」與「編譯」步,再觀察快取是否命中。
不建議混用目錄結構;Gradle 模組快取在 GRADLE_USER_HOME,與 Maven 本地庫分離較易治理與清理。
2026 在遠端 Mac上跑 Gradle/Maven CI:先依矩陣選私服或公共鏡像,固定 GRADLE_USER_HOME 與 .m2,用核心數封頂 workers 與 mvn -T,並以120s 級逾時+2/4/8 秒退避包住依賴步。下一步請瀏覽免登入頁面:MacPull 首頁、遠端 Mac 套餐購買、說明中心(SSH/連線)。
遠端 Mac × Java 依賴拉取
固定快取與併發閾值,穩定跨境構建
以下連結皆為站內免登入頁面:首頁了解節點、購買套餐、說明中心查 SSH/連線步驟。