Интент поиска — сравнение и альтернатива для CI: в 2026 году удалённые сборки на Apple Silicon всё чаще завязаны на корпоративный прокси реестров: один управляемый вход для npm и PyPI вместо прямого egress в публичные CDN. На общих Mac-раннерах чаще падает не «медленный Python», а перегруз потоков к upstream, устаревшие метаданные по TTL и обрыв по диску, который сносит тёплые tarball между job. Ниже — предпосылки выбора, таблица Artifactory и Nexus, каталоги кеша и окна очистки, копируемые пороги и таймауты и три шага CI-ворот. Без входа: главная MacPull, каталог блога; по смежной теме PyPI/uv — матрица uv и PyPI на удалённом Mac.

Предпосылки выбора: когда 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 к вашему репозиторию удобнее заказывать после просмотра тарифов и оформления на странице покупки.