- Один 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; сначала прогрейте кеш |
⑥ Исполняемый чеклист: пять шагов до первой зелёной сборки
./gradlew и mvnw, чтобы CI не подтягивал версии в середине job.GRADLE_USER_HOME и MAVEN_OPTS=-Dmaven.repo.local=....-T из таблицы выше.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-пайплайнов. Читайте материалы на главной, оформляйте тариф или откройте раздел помощи — без обязательного логина.