① Сценарий: 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; ближе к зеркалу: 8–16 |
| Таймаут чтения HTTP (с) | UV_HTTP_TIMEOUT (алиас UV_REQUEST_TIMEOUT) |
120–300 для крупных wheel |
| Таймаут подключения (с) | UV_HTTP_CONNECT_TIMEOUT |
30–60 |
| Число повторов HTTP | UV_HTTP_RETRIES |
5–8 |
| Каталог кеша (изоляция 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 не завышать (например 2–4), чтобы не забить CPU |
При смене зеркала не переиспользуйте тот же 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.lockпослеuv lock. - На раннере:
uv sync --frozen(при необходимостиUV_LOCKED=1/ флаг--lockedдля проверки, что lock не устарел относительно pyproject). - Если остаётесь на requirements:
uv pip compile … --generate-hashes, в CIUV_REQUIRE_HASHES=trueиuv pip sync requirements.lock. - Ключ кеша CI: хеш
uv.lock, минорная версия Python, хост изUV_DEFAULT_INDEX, commit.
Падение на этапе проверки 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.
Сначала стабильные зависимости — потом обучение и тесты
MacPull даёт удалённые Mac на Apple Silicon для согласованной с локальной средой установки wheel. Рядом по теме на английском (без логина): Git & Docker pull acceleration.
Тарифы Помощь и документация