Три типичных узких места
- Сеть и маршрутизация: индекс и крейты тянутся с разных хостов; на длинном пинге и при фильтрации трафика fetch падает без явной политики повторов.
- Политика lockfile: смешение зеркала и прямого registry меняет checksums в метаданных; без единого источника и флага locked команда получает недетерминизм в CI.
- Инфраструктура раннера: на общем удалённом Mac несколько job делят диск и кеш; monorepo и подмодули умножают число отдельных каталогов с target и усугубляют гонки за полосу.
Матрица решений: зеркало, прокси, прямой registry и Cargo.lock
Выбирайте строку по требованиям безопасности и того, кто владеет политикой сети. Зеркало ускоряет при согласованном индексе; прокси годится при едином корпоративном выходе; прямой crates.io проще аудировать, но чувствителен к задержке.
| Вариант | Когда уместен | Risk для lockfile | Ключевые настройки |
|---|---|---|---|
| Прямой sparse crates.io | Низкая задержка до CloudFront, нет своего зеркала | Минимальный при locked | CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse, при необходимости CARGO_NET_RETRY |
| Замена source на зеркало | Трансграничный трафик дешевле через доверенный индекс | Выше, если зеркало отстаёт | .cargo/config.toml: replace-with, отдельный [source.*] с registry = "sparse+https://…" |
| HTTP(S) прокси | Единый исходящий шлюз, DLP, белые списки | Стабильно при фиксированном канале | HTTP_PROXY, HTTPS_PROXY, NO_PROXY для внутренних Git |
| git-fetch-with-cli | Git-зависимости за корпоративным Git через SSH | Зависит от Git, не от HTTP-зеркала крейтов | [net] git-fetch-with-cli = true |
Правило 2026 для lockfile: бинарники и деплой коммитят Cargo.lock и в CI вызывают cargo build --locked или cargo test --locked. Библиотека для crates.io lock обычно не хранит, но внутренний monorepo часто фиксирует один lock на workspace — тогда зеркало должно быть одинаковым на всех раннерах и девелоперских Mac.
Три шага настройки CI на удалённом Mac
Внутри каждого шага — конкретные действия, которые можно перенести в скрипт раннера или workflow.
rust-toolchain.toml, включите кеш каталога CARGO_HOME/registry и target на постоянном диске удалённого Mac. Это снижает повторные загрузки между job..cargo/config.toml секцию [net] retry = 8 и экспортируйте CARGO_NET_RETRY=8 в CI для единообразия. Для sparse-индекса задайте CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse. Прокси вынесите в секреты HTTPS_PROXY.cargo fetch --locked, затем основную команду с --locked. При сбое покажите cargo tree -i для конфликтующего крейта. Документируйте выбранный домен индекса в README, чтобы локальные Mac совпадали с CI.Пример переменных в CI (YAML)
env:
CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
CARGO_NET_RETRY: "8"
CARGO_INCREMENTAL: "0"
# при корпоративном MITM:
# SSL_CERT_FILE: /path/to/ca-bundle.crt
# HTTPS_PROXY: http://proxy.example:8080
Пример фрагмента config.toml для замены индекса на зеркало (домен и путь проверьте у поставщика зеркала; иллюстрация — публичный sparse-индекс TUNA):
[source.crates-io] replace-with = 'mirror' [source.mirror] registry = "sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/"
FAQ: таймауты, сертификаты и прокси
Таймауты и обрывы. Сначала поднимите net.retry и переменную CARGO_NET_RETRY, затем проверьте MTU и стабильность до static.crates.io. На удалённом Mac с общим каналом разносите тяжёлые cargo fetch по расписанию.
Сертификаты. Корпоративный MITM требует SSL_CERT_FILE с полной цепочкой или установки доверенного корня в Keychain. Не отключайте проверку TLS в продакшен-сборках.
Прокси. Задайте HTTP_PROXY и HTTPS_PROXY, исключите внутренние Git-хосты через NO_PROXY. Для зависимостей из Git включите git-fetch-with-cli, чтобы использовать настроенный ~/.ssh/config.
Git-подмодули и monorepo: на что смотреть
В monorepo с [workspace] держите один общий Cargo.lock в корне и единый CARGO_TARGET_DIR на раннере, чтобы не плодить дубликаты артефактов. Подмодули с отдельными манифестами собирайте отдельными шагами: сначала git submodule update --init, затем cargo в нужном каталоге, иначе checksums в родительском lock не покроют вложенный крейт.
Если Rust-сервис живёт рядом с iOS/Android, согласуйте политику зеркал с CocoaPods и npm — обзор зеркал для экосистемы Mac — в гайде по Homebrew, npm и CocoaPods.
Краткий чеклист для цитирования
- Детерминизм:
cargo build --lockedпосле закоммиченногоCargo.lockдля приложений и релизов. - Повторы сети:
[net] retryв.cargo/config.tomlплюсCARGO_NET_RETRYв окружении CI. - Индекс: протокол sparse и явный домен индекса, задокументированный для всех удалённых Mac и раннеров.
Итог и следующий шаг
Матрица «прямой индекс — зеркало — прокси — Git CLI» задаёт архитектуру канала; lockfile и --locked фиксируют воспроизводимость; три шага покрывают кеш, сеть и валидацию на удалённом Mac. Чтобы сократить сетевые сюрпризы, совместите узел CI с географией registry или выделите стабильный удалённый Mac под команду.
Без входа в аккаунт вы можете открыть тарифы и описание узлов, страницу оформления аренды или центр помощи; обзор площадки — на главной. Попробуйте выделенный Mac Mini под Rust CI: предсказуемый диск и SSH уменьшают флапание сборок при тяжёлом cargo fetch.
Удалённый Mac для Rust CI и Cargo
Mac Mini под cargo test и кросс-компиляцию: смотрите тарифы и узлы без входа. Документация — в центре помощи; другие статьи — в блоге.