environment.yml может дать разный граф пакетов, если отличаются порядок каналов, зеркало или версия solver. В эксплуатации безопаснее опираться на сухой прогон (dry-run) и платформенный lockfile, чем на «вчера сборка прошла». Этот материал намеренно не повторяет разборы ускорения Git, npm или Homebrew — только фронтенды conda, libmamba и политика согласования YAML. Внутренние ссылки без входа: главная MacPull, каталог блога, смежная матрица по другому менеджеру окружений — Nix Flake и substituter на Mac CI.
Матрица решений: conda, mamba и micromamba
Все три инструмента читают одни и те же метаданные репозитория, но различаются единицей развёртывания, значениями solver по умолчанию и путями кеша. На общем пуле раннеров важнее не «самый быстрый install», а воспроизводимый lock и предсказуемые логи.
Зафиксируйте для команды три проверки: (1) CI и ноутбук читают один и тот же .condarc; (2) вывод conda info согласован по активным каналам, прокси и SSL; (3) в артефакте сборки записаны строки версий mamba/micromamba. Тогда при инциденте проще ответить, кто видел другой repodata.json, а не гадать про «случайный» апдейт индекса.
| Инструмент | Когда уместен | Плюсы | Риски в CI |
|---|---|---|---|
| conda (classic) | Легаси-рецепты, conda-build | Больше примеров в документации | Различия solver; фиксируйте lock и версию conda-libmamba-solver |
| mamba | Крупные среды, частые install | Быстрый resolve, читаемые логи libmamba | Одинаковый CONDA_SOLVER=libmamba и .condarc для всех |
| micromamba | Один бинарник, эфемерные агенты | Простой префикс, мало зависимостей ОС | Обязательно разносите MAMBA_ROOT_PREFIX по job; не смешивайте с чужим Miniconda |
Зеркальные конечные точки и каналы: channel_alias и .condarc
Порядок в environment.yml в секции channels: напрямую влияет на выбор билдов. Если корпоративное зеркало ближе к площадке, чем публичный CDN, задайте channel_alias или явные HTTPS-URL каналов и раздавайте один и тот же .condarc разработчикам, CI и удалённому Mac. Перед спором о «скорости канала» проверьте цепочку доверия TLS: переменная SSL_CERT_FILE должна указывать на согласованный пакет корней.
# Пример: только для текущего workspace (подставьте реальный хост зеркала)
export SSL_CERT_FILE="${SSL_CERT_FILE:-/etc/ssl/cert.pem}"
cat > ./ci.condarc <<'EOF'
channels:
- conda-forge
channel_priority: strict
# channel_alias: https://mirror.internal.example.invalid/conda
EOF
export CONDARC="${PWD}/ci.condarc"
export CONDA_CHANNEL_PRIORITY=strict
Строгий приоритет каналов уменьшает сюрпризы при смешении defaults и conda-forge, но не заменяет аудит одобренных URL и политики TLS-инспекции на периметре.
Параметры параллельной установки и загрузки
mamba и micromamba позволяют настраивать параллелизм загрузки и распаковки. На общем удалённом Mac произведение «число job × потоки загрузки» быстро упирается в исходящий лимит регистра или в диск. Начинайте с консервативных значений и поднимайте их только по метрикам p95, а не «на глаз».
| Переменная / флаг | Назначение | Стартовое значение | Заметка |
|---|---|---|---|
MAMBA_ROOT_PREFIX | Корень micromamba | ${CI_WORKSPACE}/.mamba | Изолирует соседние job |
CONDA_PKGS_DIRS | Кеш .conda/pkgs | ${CI_WORKSPACE}/.conda/pkgs | Общий кеш — только с политикой блокировок и уборки |
MAMBA_DOWNLOAD_THREADS / -j | Параллель загрузок | 4, затем 8 при стабильной сети | При росте 429 — снижать |
CONDA_SOLVER | Движок resolve | libmamba | Согласуйте с тем, что использовали при генерации lock |
CONDA_HTTP_TIMEOUT | Таймаут HTTP | 90–120 с | Увеличивайте на нестабильных линках до появления очереди |
Ошибки и повторы: HTTP 429, repodata и 5xx
Трансграничный маршрут часто сочетает 429 Too Many Requests, задержки при скачивании repodata.json и краткие 5xx на зеркале. Если заголовок Retry-After присутствует, соблюдайте его; иначе используйте лестницу пауз 2·4·8·16 секунд с небольшим случайным сдвигом. Не запускайте одинаковый шаг восстановления одновременно десятками job без верхней границы — вы сами создадите шторм на зеркало.
Политику исходящих запросов к артефактным registry (Helm OCI, контейнеры) лучше согласовать с соседними гайдами по пайплайну, чтобы единый белый список и лимиты не противоречили друг другу.
export CONDA_HTTP_TIMEOUT="${CONDA_HTTP_TIMEOUT:-120}"
# Пример: оболочка повторов для install (bash/zsh)
for i in 1 2 3 4 5; do
micromamba install -y -p ./.venv -c conda-forge numpy && break
sleep $((4 * i))
done
Согласованность lockfile, export и environment.yml
Пример критериев приёмки: (1) из одного environment.yml генерируется conda-lock для osx-arm64 и коммитится; (2) CI создаёт среду только из lock на релизных ветках; (3) после установки сравниваются micromamba export или conda list --explicit с эталонным снимком; (4) версии инструментов фиксируются в логе. Для релиза ценнее пустой diff, чем комментарий «всё последнее подтянулось».
conda env export --from-history полезен как человекочитаемый контроль намерений, но не заменяет полностью зафиксированный граф в lock. Держите в репозитории и YAML-намерение, и lock — с ясными правилами, какой файл главный на какой ветке.
export MAMBA_ROOT_PREFIX="${CI_WORKSPACE:-$PWD}/.mamba-root"
export CONDA_PKGS_DIRS="${CI_WORKSPACE:-$PWD}/.conda/pkgs"
export CONDA_CHANNEL_PRIORITY=strict
micromamba create -y -p ./.venv -f environment.yml --dry-run
conda-lock lock -f environment.yml -p osx-arm64 -o conda-lock.yml
micromamba create -y -p ./.venv -f conda-lock.yml
micromamba export -p ./.venv > export-after-ci.yml
diff -u baseline-export.yml export-after-ci.yml || true
FAQ (согласовано с JSON-LD)
В: Почему mamba и conda дают разные версии пакета?
О: Сравните каналы, channel_priority и solver. Остаточный разброс закрывайте lockfile, а не «ручным» pin в YAML без обоснования.
В: Повреждённый pkgs на общей машине — что делать?
О: Разделите CONDA_PKGS_DIRS по job или введите сериализацию записи; точечно удаляйте поддерево проблемного пакета перед повтором, а не весь кеш без причины.
В: Нужен ли отдельный раздел про контейнеры?
О: Для OCI-слоёв и чартов используйте специализированные матрицы в блоге; здесь — только conda-артефакты и YAML.
Итог и тарифы удалённого Mac
Трансграничные pull из экосистемы conda становятся управляемыми, когда зафиксированы зеркало и каналы, параллелизм, политика повторов и авторитетный lockfile относительно environment.yml. Если на Apple Silicon нужны выделенный диск под кеш, предсказуемый egress и одновременные сборки без лишних столкновений по pkgs, имеет смысл рассмотреть выделенный узел MacPull.
Без обязательного входа доступны: тарифы, покупка и аренда, центр помощи, технический блог и главная страница. Сопоставьте число параллельных job, объём SSD под .conda и требования к исходящим адресам с выбранным планом.
Удалённый Mac для conda и CI
Тарифы, оформление, помощь и материалы блога открываются без регистрации.