🚀 給跨國團隊維護 iOS/Android/後端共用 Gradle 倉的 CI 維護者:跨境網路會拖長解析parallel 又與守護行程搶記憶體。本文以決策矩陣整理 settings.gradle.kts 鏡像鏈、gradle.properties遠端建置快取鍵lockfile 驗收與 FAQ(401、憑證釘選、私服混用),可抄進 Runbook 以利交接與版本對齊備查。延伸:Gradle/Maven 矩陣CocoaPodsSPM首頁

跨境拉取瓶頸畫像(誰在拖慢解析)

(一)模組各自宣告倉庫會放大 RTT。(二)--parallel 加過高 workers.max 易觸發429或 TLS 排隊。(三)未固定 GRADLE_USER_HOME 會造成命中假象;多人 uid 混用時更易損壞 modules-2

settings.gradle.kts:dependencyResolutionManagement 鏡像鏈模板

核准域名集中在 dependencyResolutionManagement.repositories;Android 請保留 google()mavenCentral() 排序後再接私服/鏡像。

// settings.gradle.kts(請替 URL)
dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
    maven { url = uri("https://nexus.example.com/repository/maven-public/") }
    maven { url = uri("https://mirror-region.example/maven2") }
    google()
    mavenCentral()
  }
}

💡 FAIL_ON_PROJECT_REPOS 可避免子模組另開公網倉。

遠端 Mac CI:鏡像策略 × parallel × 快取鍵(決策矩陣)

情境鏡像/倉庫策略parallel/workers 建議遠端建置快取鍵要點
共享節點多 job私服優先、禁散落 mavenparallel=trueworkers.max≤實體核並預留系統鍵含 Gradle 版、JDK、os.arch;換 toolchain 要 bump
弱網逾時最短鏡像鏈降 workers;分拆下載/編譯步先拉高逾時;共用汙染則加鍵前綴
私服+公開混用內部 group 走路由其餘 fallbackparallel 可開、控連線數鎖檔進庫後放量;鍵含鎖檔雜湊

同機若還跑 npm/Docker 拉取,請將最重下載步錯開尖峰,降低頻寬互搶。

parallel worker 與守護行程記憶體峰值閾值

與 Xcode 等同機時,org.gradle.jvmargs 峰值須低於 RAM 扣掉系統與他 job;開 Configuration Cache 再多留堆疊。

# gradle.properties(示例,請依節點 RAM 調整)
org.gradle.parallel=true
org.gradle.workers.max=4
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8
org.gradle.daemon=true

遠端建置快取鍵命名與失效策略

鍵須區分 JDK 廠商/版號與相依圖;升級 AGP 或 Kotlin 外掛視為強制失效並刷新 CI 鍵。若產物須跨平台位元組一致,鍵也應納入與 ABI 相關旗標。

可引用:(1)/var/cache/gradle-ci 單一 uid;(2)HTTP 逾時一百二十秒起;(3)重試二四八秒退避、共三至五輪;(4)磁碟水位告警應早於快取爆滿。

落地步驟(逾時、重試、目錄與驗收)

1

目錄:export GRADLE_USER_HOME=/var/cache/gradle-ci,確認 caches/modules-2 可寫;共享卷選支援檔案鎖的檔案系統。

2

逾時:gradle.propertiessystemProp.org.gradle.internal.http.connectionTimeout=120000socketTimeout=120000(毫秒);鏡像在海外時可再加長並打線上探針驗收。

3

CLI:./gradlew --parallel --build-cache(後端支援遠端快取時);一次性容器可加 --no-daemon

4

重試:for i in 1 2 3 4 5; do ./gradlew … && break || sleep $((2**i)); done,設上限。

5

lockfile:乾淨樹跑解析,鎖檔雜湊進 CI 鍵;漂移先查鏡像鏈。

FAQ:401、憑證釘選、私服混用

為何 mirror 已設定仍收到 HTTP 401?

權杖未進 CI 行程或鏡像轉發至需鑑權上游。以 gradle --info 查 URL,curl 去敏複現標頭。

內網憑證釘選要如何與 Gradle 並存?

映像層匯入根 CA 到 JDK truststore,或以啟動腳本設 TLS 屬性;私鑰勿進版本庫。

私服與公共鏡像可否並列於 dependencyResolutionManagement?

可,須固定順序與路由,避免同座標在不同 runner 命中不同上游;保留核准域名清單。

總結:Kotlin DSL 集中 dependencyResolutionManagementgradle.properties 統一 parallel、workers、堆疊與逾時;快取鍵含工具鏈維度,弱網先降併發與退避。評估遠端 Mac請開:定價購買說明中心部落格

遠端 Mac × Gradle CI × Apple Silicon

對照節點規格與 SSH 指南,穩定跨境解析與快取命中

下列為站內免登入公開頁,協助您選節點與排查連線。