Objectif : stabiliser les pipelines C++ qui consomment Conan 2 sur un Mac distant partagé (Apple Silicon), lorsque le débit transfrontalier, la priorité des remotes et le lockfile ne sont pas explicitement gouvernés. Ce guide à forte intention de recherche combine tableaux, paramètres exécutables et une matrice de décision — lecture sans connexion. Point de départ rapide : accueil MacPull, liste des articles.

Prérequis et scénario d’usage

Le texte suppose Conan 2.x, un dépôt binaire accessible par HTTPS (public conancenter, Artifactory d’entreprise ou Conan Server derrière VPN) et un projet décrit par conanfile.py ou conanfile.txt. Vous exécutez des builds sur un runner macOS multi-tenant : chaque job doit isoler son CONAN_HOME pour éviter qu’un profil ou une liste de remotes « fuie » vers le job suivant.

Matrice décisionnelle (résumé) : choisissez d’abord la source d’artefacts dominante, puis bornes réseau et disque. Les lignes du tableau suivant s’appliquent une fois le point de terminaison correctement ordonné dans conan remote list.

Vous observez… Action prioritaire Indicateur de succès
Tirages depuis un continent différent du dépôt Ajouter un miroir interne ou un remote géographiquement proche ; le placer en tête d’index Latence HTTP stable ; écart p95–p50 réduit sur install
Résolution qui change entre deux branches sans modification de recette Générer et versionner conan.lock ; refuser les PR qui cassent le graphe sans mise à jour contrôlée conan graph info identique en CI et localement
Jobs concurrents qui saturent le NVMe Baisser core.download:parallel et le parallélisme de build ; ne pas compenser uniquement par de nouveaux miroirs distants Faible profondeur de file disque ; pas d’timeouts masqués

Contexte outillage mixte C++ : la chaîne vcpkg & CMake FetchContent reste pertinente pour comparer « lock côté manifest » ; ici la vérité de graphe est conan.lock.

Tableau comparatif des points de terminaison (miroirs)

Le premier remote actif sert en priorité pour la résolution des références. Documentez l’URL exacte (chemin .../api/conan/<repo> pour Artifactory) et le mode d’auth (utilisateur API / token dans le gestionnaire de secrets du CI).

Type de point de terminaison Cas d’usage typique Compromis
conancenter (amont public) Démarrage rapide, paquets largement disponibles, peu d’exigences de conformité Dépendance au réseau public ; latence variable ; politique de rétention externe
Artifactory / dépôt d’entreprise Caches replicats régionaux, audit, jetons à durée courte Maintenance des repositories ; alignement des index et des permissions
Serveur Conan auto-hébergé Contrôle total, même rack que le runner dans le idéal Opérations sauvegarde/mise à jour ; TLS et quotas à surveiller

Commandes remote (exemples exécutables) :

conan remote list
conan remote add company https://artifacts.example.com/artifactory/api/conan/conan-cpp
conan remote login company "$CONAN_USER" -p "$CONAN_PASSWORD"
conan remote update company --index 0
# conan remote disable conancenter   # si vous imposez 100 % interne

Remplacez l’URL par votre endpoint réel ; évitez de committer identifiants ou URL internes non routables depuis le poste de développement si ce n’est pas voulu.

Concurrence et seuils de timeout

core.download:parallel contrôle le nombre de téléchargements simultanés côté client Conan. Sur un Mac CI partagé, monter cette valeur sans mesurer le WAN et le débit disque déclenche des storms d’E/S et des erreurs HTTP difficiles à distinguer des vrais incidents serveur.

Paramètre / variable Ordre de grandeur conseillé Note
core.download:parallel 4–8 pour NVMe partagé ; 8–16 seulement si dépôt proche et CPU/IOPS disponibles Abaissez dès apparition de 429 ou de timeouts SSL
Parallélisme cmake --build -j ≤ nombre de cœurs logiques alloués au job, souvent inférieur sur hôte mutualisé Le build sature CPU et disque en même temps que Conan tire des binaires
Boucle retry shell Pauses 4 → 12 → 30 → 90 s entre tentatives Couvre maintenances courtes et saturations ponctuelles du reverse-proxy
export CONAN_HOME="${CI_PROJECT_DIR:-$PWD}/.conan2"
conan config set core.download:parallel=8
# Contrôle : grep -E 'download:parallel' "$CONAN_HOME/global.conf" 2>/dev/null || true

Répertoires de cache sur Mac CI distant et garde-disque

CONAN_HOME regroupe configuration et stockage des paquets ; le répertoire p suit la croissance du cache binaire. Pour le compilateur, ccache accélère les rebuilds : fixez CCACHE_DIR sous le workspace du job, pas sur un volume SMB. Xcode peut réutiliser DerivedData uniquement si votre politique d’équipe l’autorise explicitement — sinon isolez un dossier par pipeline.

export CONAN_HOME="${CI_PROJECT_DIR:-$PWD}/.conan2"
export CCACHE_DIR="${CI_PROJECT_DIR:-$PWD}/.ccache"
export CCACHE_MAXSIZE="${CCACHE_MAXSIZE:-2G}"
ccache -s
du -sh "$CONAN_HOME/p" 2>/dev/null || true
df -h "$(dirname "$CONAN_HOME")"

Alignez-vous sur les mêmes seuils relatifs que pour les autres outils du pool (souvent 80 / 85 / 90 % d’occupation du volume selon criticité) : la procédure est détaillée dans la FAQ concurrence de pulls & disque — mêmes garde-fous pour un SSD partagé sous charge CI.

Reprises sur échec et cohérence du lockfile

Générez le lock sur un agent « de référence » (même famille d’OS, même profil Conan) puis appliquez-le en CI avec --lockfile. Avant compilation, conan graph info valide que le graphe résolu correspond au fichier versionné — utile comme porte de PR.

cd "${CI_PROJECT_DIR:-$PWD}"
conan lock create . --lockfile-out=conan.lock
# Plus tard / autre job :
conan install . --output-folder=build --lockfile=conan.lock --build=missing
conan graph info . --lockfile=conan.lock

# Retry avec backoff (exemple bash)
for wait in 4 12 30 90; do
  conan install . --output-folder=build --lockfile=conan.lock --build=missing && break
  echo "Conan install échoué, nouvel essai dans ${wait}s..."
  sleep "$wait"
done

Si le graphe diffère, vérifiez l’alignement des profils (arch, compiler.version, os.sdk) et l’absence de second CONAN_HOME persistant entre jobs.

FAQ

Puis-je mélanger plusieurs remotes sans lockfile ?

Oui techniquement, mais la reproductibilité chute : la priorité de remote et l’état du cache influencent la résolution. En CI sérieuse, conan.lock est le contrat ; les remotes déterminent surtout d’où viennent les artefacts déjà figés.

conan install ignore mon lock : que vérifier ?

Présence de l’option --lockfile=conan.lock, chemin correct depuis la racine du dépôt, et cohérence de CONAN_HOME avec la machine qui a exécuté conan lock create.

Le cache compilateur grossit sans limite : bonne pratique ?

Non — fixez CCACHE_MAXSIZE et planifiez invalidation ou répertoire jetable par job pour les pipelines les plus sensibles.

Synthèse

Sur un Mac distant partagé, Conan 2 reste prévisible lorsque les remotes sont explicitement ordonnés, le parallélisme de téléchargement borné par rapport au disque réel, et le lockfile validé par graph info avant merge. Pour comparer d’autres stratégies de tirage (registres conteneurs, autres gestionnaires), parcourez le blog technique.

Les optimisations réseau ne remplacent pas une gouvernance de cache local : sur NVMe mutualisé, une valeur trop agressive de core.download:parallel coûte plus cher que de passer par un miroir interne mal dimensionné.

Aller plus loin sans compte

Accueil, achat de nœuds et centre d’aide restent accessibles publiquement — idéal pour calibrer un runner macOS avant de figer Conan en production.

Articles liés : vcpkg & FetchContent · FAQ pool & disque