Sur une CI Mac cloud à cycle court en 2026, une fois Xcode épinglé et CocoaPods / SwiftPM verrouillés, la variance dominante vient rarement du seul CPU pendant toute la durée du job. Ce qui bouge vraiment, c’est où vivent les caches et combien vous payez en octets à chaque lancement : restauration à froid depuis un stockage objet, synchronisation rsync sur un lien régional, ou tranche déjà chaude sur le SSD éphémère du runner. Ce billet compare trois emplacements pratiques — cache partagé distant, disque local du nœud, hybride de transit — puis propose une matrice de réutilisation et une liste de paramètres prêts à coller dans vos scripts.
Ce qui bouge : DerivedData, CocoaPods, sccache
Pour une CI Apple, trois zones concentrent octets et inodes. DerivedData porte caches de modules et intermédiaires ; fort impact sur l’incrémental mais fragile entre mineures Xcode. CocoaPods (Pods/ plus ~/Library/Caches/CocoaPods) est volumineux mais plus stable si Podfile.lock est appliqué sans exception. sccache (ou équivalent) déporte C/C++/Rust déjà vus vers un backend partagé — utile quand le graphe est multilingage ou que les mêmes blobs tiers se recompilent sur de nombreuses branches.
Quand la pression vient d’une revue App Store ou d’un build d’urgence, le coût du « vide cache » se lit directement sur l’horloge : voir aussi notre comparaison Builds d'urgence et revue App Store en 2026 : acheter un Mac ou louer un Mac cloud à la journée ou à la semaine ? pour cadrer location vs achat avant d’optimiser la sync.
Cold start vs tranche chaude
Un cold start, ici, signifie qu’aucun cache utile n’est présent pour le checkout visé : VM neuve, $RUNNER_TEMP effacé, ou branche qui invalide votre empreinte. Une tranche chaude, c’est au moins un des ensembles {DerivedData, cache Pods, objets sccache} déjà sur stockage rapide local ou joignable avec un petit delta.
Règle empirique interne : si la médiane des jobs fait moins d’une douzaine de minutes et que vous recyclez souvent les machines, privilégiez un temps de restauration prévisible plutôt qu’un taux d’hit incrémental maximal. Une restauration lente qui bloque xcodebuild annule les gains M-series. Pour la persistance des agents et des chemins entre sessions sur macOS, les différences launchd et SIP méritent un passage par Déployer OpenClaw sur un Mac cloud en 2026 : validations macOS face à un VPS Linux, persistance launchd et FAQ de dépannage reproductible — les mêmes garde-fous s’appliquent aux scripts qui montent vos caches.
Podfile.lock, les versions SPM résolues, le numéro de build Xcode et éventuellement MODULECACHE_DIR, puis namespaciez les objets distants. Réutiliser un DerivedData « voisin » est la voie royale vers des tickets « clean OK, incrémental flaky ».
Bande passante de synchronisation et latence de queue
Les caches distants brillent quand plusieurs runners partagent les mêmes blobs ; ils pénalisent si chaque job traverse un arbre profond sur un lien à forte latence. Préférez des outils qui préservent les métadonnées et sautent vite les fichiers inchangés (rsync --delete-delay, sync objet multipart, appliance dédiée). Surveillez la symétrie sortante : retélécharger Pods sur chaque worker éphémère peut dépasser le fetch Git si le CDN est froid.
Pour sccache, mesurez le RTT serveur séparément des IO disque. Un NVMe submilliseconde sur le runner ne compense pas 40 ms aller-retour si le graphe de compilation déclenche des milliers de petites lectures cache.
Matrice de réutilisation (terrain)
| Signal | Favoriser cache distant partagé | Favoriser disque local du nœud |
|---|---|---|
| Rotation des runners | Élevée (pool élastique) | Faible (hôte dédié) |
| Éventail de branches | Nombreuses petites branches fonctionnelles | Trains de release à graphe stable |
| Confidentialité des artefacts | Bucket chiffré + périmètre IAM | Disque mono-locataire acceptable |
| Type de build | Fortes réutilisations C/C++ via sccache | Incrémental Swift dense avec Xcode stable |
Liste de paramètres exécutables (copier-coller)
Bloc ci-dessous comme squelette de script : renseignez les points de terminaison, injectez vos secrets proprement, et gardez des chemins natifs macOS (~ n’expanse pas pareil sous launchd et en shell interactif).
# Espace de noms par empreinte export CACHE_NS="${XCODE_VERSION}_${PODFILE_LOCK_SHA}" # Isolation du cache de modules Clang export CLANG_MODULE_CACHE_PATH="$PWD/.ci_modcache/$CACHE_NS" # CocoaPods déterministe + répertoire maison export COCOAPODS_DISABLE_STATS=1 export CP_HOME_DIR="$PWD/.cocoapods/$CACHE_NS" # Restauration / publication (compromis compression vs CPU) rsync -aH --numeric-ids --delete-delay --partial \ "cache:$REMOTE_DERIVED/$CACHE_NS/" "~/Library/Developer/Xcode/DerivedData/" # sccache (exemple) export SCCACHE_BUCKET="votre-org-sccache" export SCCACHE_REGION="auto" export RUSTC_WRAPPER=sccache
Terminez chaque job par une publication conditionnelle : n’envoyez vers le préfixe partagé qu’après tests verts et empreinte concordante, afin qu’un état mauvais n’empoisonne pas le namespace. Purgez les anciens namespaces avec des règles de cycle de vie alignées sur la rétention des branches.
Sur un Mac mini cloud VPSSpark, la stratégie de cache tient la route
Les scénarios ci-dessus supposent une baseline macOS stable et des disques prévisibles — exactement ce qu’un Mac mini Apple Silicon dédié offre. L’outil Unix natif, Homebrew et Xcode partagent la même pile que vos scripts CI, sans la dérive de pilotes typique des PC Windows grand public. La mémoire unifiée évite que linker et driver Swift ne se retrouvent limités par le swap, et la stabilité de macOS avec Gatekeeper / SIP limite les dérives d’environnement qui invalident les caches du jour au lendemain.
La consommation au repos d’un Mac mini récent reste dans la zone de quelques watts : garder un runner toujours actif avec un disque chaud local se rapproche d’un appareil branché plutôt que d’un radiateur électrique. Le modèle hybride — stockage objet distant plus tranche locale persistante — devient naturel plutôt que forcé.
Si vous standardisez en 2026 une CI iOS/macOS à cycles courts, le Mac mini M4 cloud VPSSpark est un excellent banc d’essai pour votre arithmétique de cache — découvrez les offres maintenant et livrez des builds incrémentaux sans parier sur des runners incohérents.