Кому полезно: JVM-командам на удалённом Mac с медленным трансграничным каналом и частыми Gradle/Maven resolution. Здесь: матрица зеркал и кешей, пороги параллелизма, таймауты и backoff повторов для 2026. Внутренние ссылки без входа: список блога, смежная матрица Go modules (GOPROXY), главная.
  • Один URL без цепочки: единственный Nexus в settings.gradle или settings.xml без упорядоченных fallback — при сбое замирает весь resolve.
  • Параллелизм бьёт по диску: высокие --parallel и org.gradle.workers.max на общем SSD маскируются под «зависание сети».
  • Кеш не там: дефолтные ~/.gradle и ~/.m2 на маленьком или сетевом home усиливают блокировки и конкуренцию за IO.

① Матрица решений: где должен «заканчиваться» resolution в 2026 году

Подход Когда уместен Осторожно на удалённом Mac CI
Приватный Nexus, Artifactory или GitHub Packages как вход Аудит артефактов, TLS в периметре, единый egress Нужен резерв; планируйте размер modules-2 и .m2
Прямой Maven Central и Gradle Plugin Portal Публичный OSS и стабильный исходящий канал Скачки задержки — сначала таймауты, потом потоки
Гибрид: упорядоченные репозитории Внутренние координаты на корпоративном зеркале, публичные на Central или утверждённом хабе Зафиксируйте порядок repositories в Gradle и mirrorOf в Maven

② Сравнение конечных точек зеркал (шаблон URL — подставьте свой хост)

Роль endpoint Типичная форма URL Плюс Минус на общем Mac CI
Корпоративный group repository https://nexus.corp.example/repository/maven-public/ Один исходящий контур и кеш артефактов Единая точка отказа без healthcheck
Maven Central https://repo1.maven.org/maven2/ Канонические метаданные Задержка и лимиты — ограничивайте параллелизм
Утверждённое региональное зеркало URL по политике комплаенса Ниже RTT, если разрешено Лаг репликации ломает resolve — отслеживайте SLA
Gradle Plugin Portal https://plugins.gradle.org/m2 Плагины отдельно от Central Часто выпадает из allowlist прокси

③ Каталоги кеша: GRADLE_USER_HOME и локальный репозиторий Maven (.m2)

Артефакт / слой Путь или переменная Заметки для CI
Gradle user home export GRADLE_USER_HOME=/usr/local/ci/gradle Экспорт до ./gradlew; при мульти-тенантности — раздельные корни
Скачанные модули $GRADLE_USER_HOME/caches/modules-2 Самое крупное дерево; prune в окне обслуживания
Transforms и jar-кеш $GRADLE_USER_HOME/caches/ (подкаталоги) Gradle 8+ усиливает IO на transforms
Локальный Maven repo ~/.m2/repository или -Dmaven.repo.local=/usr/local/ci/m2 Общий .m2 требует дисциплины блокировок

④ Параллелизм: --parallel, workers.max и пороги Maven -T

Инструмент Параметр Консервативный старт Повышать только если
Gradle org.gradle.parallel=true Добавьте org.gradle.workers.max=4 на общих пулах Очередь диска ровная, узкое место всё ещё сеть
Gradle CLI --parallel Согласовать с потолком workers; на мелких job можно не включать CPU простаивает при конфигурации и запас по IO есть
Maven mvn -T 1C или явное -T 4 На общих дисках чаще -T 2 или -T 4 Выделенный хост, низкая утилизация NVMe

⑤ HTTP-таймауты, повторы и backoff (слабый канал)

Слой Настройка Стартовое значение Паттерн повторов
Gradle systemProp.org.gradle.internal.http.connectionTimeout 120000 мс До 3 попыток, паузы 2s / 4s / 8s
Gradle systemProp.org.gradle.internal.http.socketTimeout 120000 мс Логируйте URL на каждой попытке
Maven Свойства wagon / resolver Тот же класс ~2 минуты Не злоупотребляйте -U; сначала прогрейте кеш

⑥ Исполняемый чеклист: пять шагов до первой зелёной сборки

1
Закрепите JDK и wrapper’ы. Зафиксируйте ./gradlew и mvnw, чтобы CI не подтягивал версии в середине job.
2
Экспортируйте корни кеша. В начале shell job задайте GRADLE_USER_HOME и MAVEN_OPTS=-Dmaven.repo.local=....
3
Упорядочьте репозитории. Сначала внутреннее зеркало, затем утверждённый публичный хаб, без «лишних» источников.
4
Ограничьте параллелизм. Gradle parallel + потолок workers; для Maven — -T из таблицы выше.
5
Зафиксируйте таймауты и повторы. Фрагмент ниже в gradle.properties; оберните ./gradlew или mvn в цикл с максимум тремя попытками.
org.gradle.parallel=true
org.gradle.workers.max=4
org.gradle.caching=true
systemProp.org.gradle.internal.http.connectionTimeout=120000
systemProp.org.gradle.internal.http.socketTimeout=120000
<!-- Maven: mirrorOf external:* на URL вашего Nexus -->

Дымовой тест: ./gradlew help или mvn -q dependency:get до полной матрицы модулей. По диску и очередям на общих раннерах полезен материал в блоге «FAQ пула удалённых Mac» (тот же раздел статей).

⑦ Цифры для дизайн-дока и ревью архитектуры

120 с на socket/connection часто достаточно для транс-тихоокеанских загрузок 2026 года до масштабирования CPU.

Четыре Gradle worker’а на общих пулах M4 нередко быстрее шестнадати для тяжёлых графов метаданных.

Три попытки с 2 с, 4 с, 8 с ограничивают wall time и переживают кратковременные сбои зеркал.

⑧ FAQ: кеш Gradle и Maven на удалённых Mac-раннерах

На job или на пул? Общий GRADLE_USER_HOME у пула, если политика позволяет; разделяйте тома, если регламентированные артефакты нельзя класть рядом с публичным кешем.

Всегда ли mvn -T 1C? Снижайте -T, когда много job делят один SSD; повышайте только на выделенных машинах.

--parallel ускоряет скачивание? В основном увеличивает число одновременных TLS — сначала зеркала, таймауты и размещение кеша на NVMe.

Итог

Упорядочьте зеркала, закрепите GRADLE_USER_HOME и .m2 на NVMe, ограничьте workers и по умолчанию используйте таймауты HTTP 120 с с тремя повторами и backoff для удалённого Mac CI в 2026.

Дальше без входа в аккаунт: главная, страница покупки удалённого Mac, центр помощи (SSH и подключение).

Сочетайте эту страницу с гайдами по диску и параллельным pull, чтобы JVM resolve не голодал Git и Docker на том же SSD.

Удалённый Mac для Gradle и Maven CI

Узлы Apple Silicon, раскладка под SSD и SSH для JVM-пайплайнов. Читайте материалы на главной, оформляйте тариф или откройте раздел помощи — без обязательного логина.