- Расхождение 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 в той же сети, что у команды. Все перечисленные страницы открываются без регистрации.