Предпосылки выбора: когда Artifactory или Nexus — правильное сужение для CI
Тренд 2026 года — artifact-first CI: тот же кластер, что хранит Docker-слои и generic-файлы, выставляет наружу виртуальные репозитории npm и PyPI, чтобы FinOps видел egress по продуктовым линиям, а security — единый аудит «кто запросил какой tarball». Выбирайте менеджер репозиториев только после фиксации границы комплаенса: нужны неизменяемые следы, virtual repo, объединяющий remote и внутренние wheel, и allowlist egress, запрещающий fallback на публичный npm или PyPI, если политика это запрещает.
На удалённом Mac добавьте к списку: идентичность на job (токен или mTLS на workspace), раздельные кеши по умолчанию без общего ~/.npm без квот, и письменное правило по отозванным пакетам и лицензиям, которое прокси применяет до записи на APFS. Если окна обслуживания и ночные сборки пересекаются и SRE не готовы к очистке без коллизий, не наращивайте параллельные воркеры установки, пока не согласованы квоты хранилища и расписание garbage collection на стороне сервера.
Для стека, где важны гибридные lockfile на стороне JS, см. Bun + npm hybrid на удалённом Mac CI.
Artifactory и Nexus: сравнительная таблица для npm и PyPI на удалённом Mac CI
Оба продукта дают remote и virtual репозитории, negative cache для 404 и политики удержания; для сравнения в поиске «альтернатива / CI» важнее эксплуатационные ручки, чем маркетинговые чеклисты.
| Измерение | JFrog Artifactory (типичный контур CI) | Sonatype Nexus Repository (типичный контур CI) |
|---|---|---|
| Виртуальные npm / PyPI | Единая модель RBAC и UI по форматам; удобно, если Docker, Helm и npm живут в одном кластере | Зрелые прокси по форматам; удобно, если Sonatype IQ и скрипты Nexus 3 уже стандарт de facto |
| Трансграничный параллелизм | Регулировать потоки retrieval и пулы HTTP-клиентов; следить за федерацией, если регионы цепочкой ходят в один hub | Настройки writer thread blob store и HTTP на репозиторий; избегать шторма метаданных в embedded БД при пиках CI |
| TTL кеша и метаданные | TTL метаданных и задачи очистки неиспользуемого; связка с lifecycle и webhook для промоушена | TTL remote metadata и negative cache на прокси; cron compact/cleanup — явно документировать пересечение с пиками пайплайнов |
| Диск и eviction | Квоты на repo/project; S3-backed storage для эластичной ёмкости | Лимиты blob store и политики cleanup; мягкие алерты до заполнения APFS на Mac от локальных зеркал |
| Интеграция с CI | REST, JFrog CLI, build-info — если release engineering уже на JFrog | REST и скрипты nexus3 — если Maven-центричное предприятие расширяет то же на npm |
Ни один прокси не заменяет дисциплину lockfile: он ускоряет уже одобренный граф, а не угадывает semver согласно настроению security «со вторника».
Для Yarn Berry и зеркал registry рядом с этим слоем см. матрицу Yarn Berry и зеркала.
Каталоги кеша на удалённом Mac и окна очистки
Репозиторный менеджер держит долгоживущий тёплый слой; job на удалённом Mac всё равно копит локальные кеши в workspace и домашних каталогах. Считайте их сбрасываемыми, но ограниченными: привязывайте к APFS с запасом относительно самого тяжёлого monorepo.
- npm:
${CI_PROJECT_DIR}/.npm-cacheчерезnpm_config_cache; на shared-образах не пишите все в один~/.npmбез подпапки на job. - pnpm / Yarn Berry:
PNPM_HOME,pnpm store pathилиYARN_CACHE_FOLDERпод каталог job, чтобы параллельные сборки не блокировали один глобальный store. - pip / uv:
PIP_CACHE_DIRиUV_CACHE_DIRна быстром локальном томе; крупные wheel конкурируют за место с Xcode DerivedData.
Окна очистки на сервере прокси: планируйте garbage collection и compact в низкий трафик для региона, где стоит репозиторий, а не часового пояса разработчиков. На раннере — post-job trim, когда свободное место пересекает линию предупреждения (например 18% свободного на корневом APFS), и жёсткий отказ до install ниже стоп-порога (например 12%), чтобы не получить полузаписанный node_modules на полном диске.
Три шага CI-ворот и исполняемые параметры (воркеры, таймауты, диск, lockfile)
Вставьте блок в шаблон пайплайна и подставьте hostname виртуального репозитория из allowlist security. Секреты — только из vault; в публичных логах оставляйте числовые капы и пути.
# --- Параллелизм (общий пул удалённых Mac; подстройте под класс CPU) ---
export NPM_CONFIG_MAXSOCKETS="${NPM_CONFIG_MAXSOCKETS:-12}"
export UV_HTTP_TIMEOUT="${UV_HTTP_TIMEOUT:-120}"
export PIP_DEFAULT_TIMEOUT="${PIP_DEFAULT_TIMEOUT:-120}"
# --- Подсказка параллелизму npm lifecycle (не путать с ядрами компиляции) ---
export npm_config_jobs="${npm_config_jobs:-4}"
# --- Пороги диска APFS (% свободного; отказ до install) ---
export MAC_CI_DISK_WARN_PCT="${MAC_CI_DISK_WARN_PCT:-18}"
export MAC_CI_DISK_STOP_PCT="${MAC_CI_DISK_STOP_PCT:-12}"
# Пример: разбор `df -g /` и exit 1 если свободно < MAC_CI_DISK_STOP_PCT
# --- Локальные каталоги (изоляция по job) ---
export npm_config_cache="${CI_PROJECT_DIR}/.npm-cache"
export UV_CACHE_DIR="${CI_PROJECT_DIR}/.uv-cache"
export PIP_CACHE_DIR="${CI_PROJECT_DIR}/.pip-cache"
# --- Только виртуальный URL прокси (пример Artifactory npm) ---
export NPM_CONFIG_REGISTRY="https://artifactory.example.com/artifactory/api/npm/npm-virtual/"
# pip/uv: index-url на ваш PyPI-proxy в Nexus или Artifactory
# --- Приёмка lockfile (примеры; выберите стек) ---
# npm: npm ci && git diff --exit-code package-lock.json
# uv: uv sync --frozen && git diff --exit-code uv.lock
На стороне сервера согласуйте таймауты сокета к upstream и лимиты потоков retrieval с UV_HTTP_TIMEOUT и PIP_DEFAULT_TIMEOUT, иначе клиент и прокси будут по-разному «висеть» на деградации публичного реестра.
Шаг 1 — только прокси: проваливайте job, если резолв уходит на hostname вне Artifactory/Nexus (grep lockfile и конфигов на запрещённый registry.npmjs.org / pypi.org, если политика требует).
Шаг 2 — неизменяемость lockfile: после установки git diff --exit-code для package-lock.json, pnpm-lock.yaml, uv.lock, poetry.lock. Frozen-команды (npm ci, uv sync --frozen и т.д.) не должны переписывать граф на чистом раннере.
Шаг 3 — диск и здоровье прокси: проверка процента свободного APFS, curl к health виртуального репозитория с токеном, вывод размера кеша в сводку сборки — чтобы онколл связывал флейки с TTL или расписанием очистки, а не с прикладным кодом.
FAQ
Можно ли параллельно держать Artifactory и Nexus для npm? Технически да, но CI должен видеть ровно один виртуальный URL на экосистему, иначе ломаются детерминизм кеша и аудит. Второй контур — только на окно миграции с явным dual-write.
Что ломается первым при слишком агрессивном TTL? Либо «невидимые» свежие внутренние пакеты из-за метаданных, либо долгий negative cache на 404 — настраивайте TTL по upstream, не одной глобальной цифрой.
Больше maxsockets всегда ускоряет трансграничный pull? Нет: после комфортного предела для прокси растёт доля TLS и дробных объектов, чаще появляются 429/502. Повышайте только при запасе на стороне репозитория и пула Mac.
Итог
В 2026 году governed registry proxy перед удалёнными Mac — норма для кросс-бордерных команд: и Artifactory, и Nexus закрывают задачу, если вы жёстко капаете конкуренцию запросов, выравниваете HTTP-таймауты клиента и сервера, связываете TTL с порогами диска и закрепляете три шага ворот по lockfile как политику merge, а не «рекомендацию».
CTA: macpull.com — главная без входа; тарифы, покупка и аренда, центр помощи; полный список материалов — каталог блога. Выделенный Apple Silicon с предсказуемым egress к вашему репозиторию удобнее заказывать после просмотра тарифов и оформления на странице покупки.