Текст для разработчиков и сопровождающих CI, которые на удалённом Mac гоняют пайплайны Python / данных / ML и нуждаются в стабильной трансграничной массовой установке wheels и sdist. Ниже — сравнительные таблицы, готовые команды и переменные окружения, разбор сбоев сети и шаги воспроизводимости. Точки входа: главная, список блога, смежный материал Rust Cargo: зеркала и lockfile (та же логика для трансграничного CI).

① Сценарий: pip, uv и conda — когда разумно выбрать uv

На удалённом раннере критичны скорость резолва, параллельные HTTP-загрузки, предсказуемый кеш и устойчивость к длинному RTT. Полная миграция с conda не обязательна, если ядро стека живёт в channel, а не в PyPI.

Инструмент Лучше подходит Ограничения на удалённом Mac CI
pip минимальные скрипты, без культуры lockfile слабее контроль параллелизма и кеша при сотнях артефактов
uv uv.lock, pyproject, быстрый uv pip как замена pip явные лимиты загрузок, таймауты, повторы, UV_CACHE_DIR
conda / mamba научные стеки, бинарные пакеты вне PyPI больший размер среды, отдельная политика mirror/channel

Практическое правило: если основной источник — PyPI и нужны воспроизводимые установки на Apple Silicon, начинайте с uv; для совместимости со старыми шагами оставьте uv pip sync по зафиксированному lock.

② Матрица исполняемых параметров: потоки, таймауты, повторы, кеш, индекс

Имена переменных соответствуют документации uv. На «тонком» трансграничном канале сначала поднимайте таймауты и UV_HTTP_RETRIES, затем осторожно увеличивайте UV_CONCURRENT_DOWNLOADS, иначе получите лавину повторов.

Цель Переменная Стартовые значения
Параллельные загрузки UV_CONCURRENT_DOWNLOADS нестабильная сеть: 4; ближе к зеркалу: 816
Таймаут чтения HTTP (с) UV_HTTP_TIMEOUT (алиас UV_REQUEST_TIMEOUT) 120300 для крупных wheel
Таймаут подключения (с) UV_HTTP_CONNECT_TIMEOUT 3060
Число повторов HTTP UV_HTTP_RETRIES 58
Каталог кеша (изоляция job) UV_CACHE_DIR например $HOME/.cache/uv-$CI_PIPELINE_ID
Индекс по умолчанию UV_DEFAULT_INDEX (предпочтительно) или UV_INDEX_URL официально: https://pypi.org/simple; корпоративное зеркало — по политике команды
Дополнительные индексы UV_INDEX (URL через пробел) вместе с UV_INDEX_STRATEGY только после оценки рисков
Параллельные сборки sdist UV_CONCURRENT_BUILDS на общем Mac не завышать (например 24), чтобы не забить CPU
# Фрагмент shell для удалённого Mac CI (GitLab/GitHub — подставьте свой ID пайплайна) export UV_CONCURRENT_DOWNLOADS=4 export UV_HTTP_TIMEOUT=180 export UV_HTTP_CONNECT_TIMEOUT=45 export UV_HTTP_RETRIES=6 export UV_CACHE_DIR="${HOME}/.cache/uv-ci-${CI_PIPELINE_ID:-local}" export UV_DEFAULT_INDEX="https://pypi.org/simple" # Проект с uv.lock: только установка по lock uv sync --frozen --no-dev # Поток requirements: закрепление на машине разработчика или отдельном job # uv pip compile pyproject.toml -o requirements.lock --generate-hashes # UV_REQUIRE_HASHES=true uv pip sync requirements.lock

При смене зеркала не переиспользуйте тот же UV_CACHE_DIR без очистки — метаданные simple-индекса и файлы в кеше могут разъехаться.

③ Трансграничная сеть: типовые сбои и отладка (TLS, сертификаты, прокси)

  • TLS / недоверенный сертификат: импортируйте корпоративный корень в связку ключей macOS; либо SSL_CERT_FILE / SSL_CERT_DIR на агрегированный PEM. Для использования системного хранилища задайте UV_SYSTEM_CERTS=true или UV_NATIVE_TLS=true (см. версию uv).
  • Обязательный HTTP(S)-прокси: HTTPS_PROXY, HTTP_PROXY, исключения для внутреннего индекса — NO_PROXY (список хостов через запятую). Убедитесь, что таймаут прокси не меньше, чем ожидаемое время скачивания крупных wheel.
  • Обрывы и RST: уменьшите UV_CONCURRENT_DOWNLOADS, увеличьте UV_HTTP_RETRIES; точечный повтор uv sync дешевле полного перезапуска пайплайна.

Общие идеи по зеркалам Git и npm на том же раннере — в статье трансграничная оптимизация Git, npm и Homebrew; ускорение Git и Docker pull на английском (без входа): Remote Mac: Git & Docker pull acceleration и русская версия гайд по Git и Docker.

④ Согласованность pyproject / requirements.lock и воспроизводимые шаги CI

Чеклист для проекта на uv
  • Ветка с изменением зависимостей заканчивается коммитом uv.lock после uv lock.
  • На раннере: uv sync --frozen (при необходимости UV_LOCKED=1 / флаг --locked для проверки, что lock не устарел относительно pyproject).
  • Если остаётесь на requirements: uv pip compile … --generate-hashes, в CI UV_REQUIRE_HASHES=true и uv pip sync requirements.lock.
  • Ключ кеша CI: хеш uv.lock, минорная версия Python, хост из UV_DEFAULT_INDEX, commit.
# Убедиться, что lock соответствует pyproject (ненулевой код выхода при расхождении) uv lock --check # Типовой путь установки в CI uv sync --frozen --no-dev

Падение на этапе проверки lock в начале job экономит минуты очереди на общем удалённом Mac.

⑤ FAQ: загрязнение кеша, платформенные wheel, смешение индексов

Загрязнение кеша. Общий каталог для параллельных job или смена индекса без инвалидации даёт рассинхрон simple-метаданных. Используйте подкаталоги на pipeline и периодически uv cache prune.

Платформенные wheel. Один и тот же lock, собранный на Linux, может не совпасть с разрешением на macOS arm64. Генерируйте lock на целевой ОС или зафиксируйте UV_PYTHON на том интерпретаторе, что в проде/CI.

Приватный индекс + зеркало. Держите зеркало PyPI в UV_DEFAULT_INDEX, приватный simple — в UV_INDEX; секреты только в переменных CI. Стратегия unsafe-best-match расширяет поиск по всем индексам — согласуйте с политикой безопасности.

Итог: в 2026 году на удалённом Mac для Python CI сначала стабилизируйте сеть (таймауты, повторы, умеренный параллелизм), затем изолируйте UV_CACHE_DIR и политику индекса, затем зафиксируйте зависимости через uv.lock и uv sync --frozen. Нужен узел с Apple Silicon рядом с вашим регионом — тарифы и оформление доступны без входа: цены, покупка, центр помощи. Дополнительно на английском: кеш Git и npm в CI на удалённом Mac.

Python / ML на удалённом Mac

Сначала стабильные зависимости — потом обучение и тесты

MacPull даёт удалённые Mac на Apple Silicon для согласованной с локальной средой установки wheel. Рядом по теме на английском (без логина): Git & Docker pull acceleration.

Тарифы Помощь и документация
Выбор узла
SSH / VNC
Гибкий срок