Для кого материал: команды C++/CMake на общих удалённых Mac с Apple Silicon, где Conan 2 должен воспроизводимо тянуть зависимости через одобренные HTTPS-конечные точки. Это туториал с поисковым намерением: от предпосылок сценария до сравнительной таблицы зеркал, параллелизма и таймаутов, каталога кеша и порога диска, затем повторов при сбоях и исполняемой приёмки conan.lock, плюс FAQ. Точки входа без входа в аккаунт: главная MacPull, список статей блога. Родственные материалы: vcpkg и CMake FetchContent на Mac CI, матрица pull из GHCR и частного registry, стратегия кешей Git/npm для ускорения CI.
  • Расхождение remotes: у разработчика открыт публичный индекс, в CI — только корпоративный URL; инциденты «нет бинарника» без реальной поломки рецепта.
  • Избыточный параллелизм: слишком высокий core.download:parallel на общей NVMe перегружает TLS и мелкие записи APFS, растёт p95 этапа prefetch.
  • Lock без профиля: закоммиченный conan.lock при неверных профилях или compiler.cppstd всё равно даёт несовместимые артефакты для релиза.

Сценарий и предпосылки

Зафиксируйте минорную версию Conan 2 в образе агента или скрипте инициализации: смешение клиентов на одном хосте ломает метаданные в локальном хранилище. Рядом с conanfile.py или conanfile.txt храните профили с явными arch, версией компилятора, compiler.cppstd и ожиданиями по SDK для macOS. Переменную CONAN_HOME направьте на быстрый том APFS в границах job или арендатора; не используйте чужой ~/.conan2 без согласованного контракта на общий read-only кеш.

Составьте список всех HTTPS-хостов, с которых Conan реально качает артефакты и индексы; при корпоративном TLS-прокси установите корневой сертификат в системное хранилище до разборов «мистических» обрывов загрузки. Определите политику кто может пересобирать conan.lock (только бот, только релизная ветка с ревью и т.д.), иначе «случайное» обновление lock с ноутбука разъедет граф между регионами.

Таблица сравнения зеркальных конечных точек

В промышленных контурах чаще заменяют публичный индекс зеркалом с тем же REST-интерфейсом Conan. Artifactory и аналоги отдают Conan-репозиторий; ваша задача — добиться, чтобы одно и то же логическое имя remote резолвило пакеты одинаково в dev и CI. При разных сетевых стэках (dual-stack у разработчика, IPv4-only у раннера) заранее проверьте DNS и доступность зеркала до запуска conan install, иначе журнал покажет циклы 403, похожие на ошибку рецепта.

Тип конечной точки Типичное применение Эксплуатационная заметка
https://center2.conan.io (remote ConanCenter) Быстрые прототипы и OSS без жёсткого списка допустимых источников Региональная задержка; сочетайте с умеренным core.download:* или pull-through кешем при трансокеанских сборках.
Виртуальный remote в Artifactory / Nexus (один URL) Объединение публичных upstream и частных пакетов под одной базой Держите в CI один включённый remote нужного имени, чтобы не получить двойной индекс «виртуал + исходные».
Выделенное on-prem зеркало (read-through) Регионы с нестабильным транзитом к публичным облакам После обновления блобов проверяйте контрольные суммы; плановые окна обслуживания зеркала согласуйте, чтобы не принимали сбой зеркала за баг рецепта.

Аудит и переключение remotes (пример копирования):

conan remote list

conan remote add corp-mirror https://artifacts.example.com/artifactory/api/conan/conan-virtual \
  --index 0

# Вариант A: переназначить существующий remote на прокси
conan remote update conancenter --url https://artifacts.example.com/artifactory/api/conan/conancenter-remote

# Вариант B: отключить публичный трафик
# conan remote disable conancenter

conan remote login corp-mirror "${CONAN_USER}" -p "${CONAN_PASSWORD}"

Параллелизм и пороги таймаутов

Параметры транспорта Conan 2 задаются в ${CONAN_HOME}/global.conf или одноразово флагами -cc / --core-conf. Ориентируйтесь на p95 времени загрузки и число конкурирующих job на хосте, а не на максимум из документации.

  • core.download:parallel — одновременные загрузки артефактов; на загруженном пуле начинайте с 4–8, до 12–16 только при устойчиво здоровых NVMe и uplink.
  • core.download:retry — повторы при ошибках сервера, часто 3–5.
  • core.download:retry_wait — пауза в секундах между попытками, ориентир 3–8; при длинных инцидентах добавляйте джиттер и backoff на уровне оркестратора (например 4, 12, 30, 90 с).

Дополнительные core.net.* зависят от минорной версии клиента; закрепите единый набор через conan config install из приватного Git, чтобы все удалённые Mac наследовали одну «лестницу».

mkdir -p "${CONAN_HOME}"
cat >> "${CONAN_HOME}/global.conf" <<'EOF'
core.download:parallel=8
core.download:retry=4
core.download:retry_wait=5
EOF

conan install . --lockfile=conan.lock \
  -cc core.download:parallel=6 \
  -cc core.download:retry=5

conan config show "core.download:*"

Кеш удалённого Mac CI: каталоги и порог на диске

Пакеты и метаданные лежат под ${CONAN_HOME}/p и соседних каталогах; для job с требованием строгой изоляции считайте весь префикс CONAN_HOME одноразовым. Для ускорения повторных сборок подключите ccache, задав отдельный CCACHE_DIR и обёртки ccache clang / ccache clang++, чтобы линковка не переписывала APFS без необходимости.

export CONAN_HOME="${CI_PROJECT_DIR:-$PWD}/.conan2-ci"
export CCACHE_DIR="${CI_PROJECT_DIR:-$PWD}/.ccache-conan"
mkdir -p "$CONAN_HOME" "$CCACHE_DIR"
export CC="ccache clang"
export CXX="ccache clang++"

du -sh "$CONAN_HOME" "$CCACHE_DIR" 2>/dev/null || true
ccache --show-stats

USED_PCT="$(df -h "$CONAN_HOME" | awk 'NR==2 { gsub(/%/,"",$5); print $5 }')"
if [ "${USED_PCT:-101}" -gt 88 ]; then
  echo "Порог диска: занято ${USED_PCT}% на $(df -h "$CONAN_HOME" | awk 'NR==2 {print $1}')"
  exit 42
fi

Пример политики: не делать необязательный префетч, если свободно менее ~12 %; чистить устаревшие ревизии через conan cache clean; согласовывать глобальную уборку SSD, если несколько арендаторов делят один физический том.

Сбои, повторы и проверки согласованности

Оборачивайте conan install в цикл повторов с верхней границей для HTTP 5xx и обрывов TLS, но останавливайтесь, если ошибка стабильна — иначе общий раннер будет крутиться вхолостую. Повторяющиеся ошибки контрольных сумм по одной и той же ссылке эскалируйте к команде зеркала, а не только чистите кеш.

Матрица решений: дисциплина lockfile

Политика Когда уместна Компромисс
conan install с --lockfile=conan.lock и --build=missing Релизные ветки и promotion артефактов При смене профиля или опций lock нужно пересоздать; зато падения прозрачны.
Обязательный lock только на main Команды с частыми feature-ветками Короткоживущие ветки могут временно разъезжаться; снижаете риск очередью merge с ботом обновления lock.
Дымовой conan graph info с JSON Раннее обнаружение переименований remote Добавляет секунды к прогону; сохраняйте JSON для узких проверок в CI.

Создание lock, установка, повтор install и приёмка:

set -euo pipefail
conan lock create . --build=missing

attempt=1
max_attempts=4
until conan install . --lockfile=conan.lock --build=missing --output-folder=build; do
  attempt=$((attempt + 1))
  [ "$attempt" -le "$max_attempts" ] || exit 1
  sleep $((attempt * 3))
done

shasum -a 256 conan.lock
git diff --exit-code -- conan.lock

conan graph info . --lockfile=conan.lock --format=json > graph-ci.json

Смежный разбор lockfile для Rust на тех же классах раннеров: Cargo: зеркала, повторы и lockfile.

FAQ

Можно ли на разных job использовать разные списки remotes? Да, но закрепите это в Terraform, тегах раннеров или документации; тихое расхождение между ноутбуком и CI — главный источник тикетов «бинарник не найден», хотя рецепт не менялся.

Должен ли core.download:parallel совпадать с -j Ninja/Make? Нет: первое управляет сетью, второе — компиляцией. Поднимайте параметры независимо после замеров давления на APFS и исходящий канал.

Почему IDE показывает другой граф, чем CI? Сверьте одинаковые пути профиля, CONAN_HOME и загрузку conan.lock; многие IDE-интеграции строят граф без lock и вводят в заблуждение при сравнении с HEAD пайплайна.

Если держать remotes, параметры загрузки и lockfile как единую политику, Conan на общих удалённых Mac перестаёт «плавать» между регионами. Проверьте настройки на выделенном Apple Silicon-узле, затем разверните тот же пакет global.conf во все агенты.

Узел Apple Silicon для проверки Conan до масштабирования CI

Сравните задержку до корпоративного зеркала и поведение APFS в той же сети, что у команды. Все перечисленные страницы открываются без регистрации.