Points clés d'abord
- Le gain x3 vient du bare metal M4 dédié + DerivedData chaud + nœuds parallèles — pas de flags compilateur supplémentaires.
- MacBook local : zéro friction ; GitHub Actions : élasticité ; VPS Mac partagé : bon marché mais contexte froid ; location bare metal : l'expérience locale sur runners facturables.
- Tableau en cinq colonnes Entry / Execution / Context / Cost / Permission — la plupart des équipes perdent sur Context (DerivedData, Keychain, inodes).
- Archive à froid vs cache chaud : écart 2–3x ; en semaine de release, chemin DerivedData fixe et interdiction du
flutter cleanrituel. - Matrice : <5 builds/jour local ; CI-first bare metal auto-hébergé ; conformité Xcode Cloud ; hybride stacks A/B/C.
- Lecture liée : pipeline Archive, Runner Flutter, gouvernance swap mémoire, codesign — liens en fin d'article.
Pourquoi les builds Xcode semblent lents — et pourquoi on accuse la mauvaise couche
Pour l'optimisation de compilation Xcode, on pense RAM, -jobs ou flags Swift. En pipelines iOS/Flutter réels, la variance de xcodebuild archive dépend surtout de la réutilisation du contexte : chemin DerivedData, graphe CocoaPods indexé, Keychain reconstruite, inodes en semaine de release.
8 minutes en local et 20 sur GitHub Actions ne signifient pas un Apple Silicon plus lent — le CI traite la machine comme jetable : checkout froid, résolution pod, import certificat à chaque run. Sur VPS Mac partagé, voisins, éviction cache et IO de backup s'ajoutent.
- Irréfutation 1 : tuner
-jobsen ignorant la dérive du chemin DerivedData. - Irréfutation 2 : comparer un CI froid au local sans médiane du chemin chaud.
- Irréfutation 3 : prix VPS bas = coût cloud Mac total, en oubliant l'attente ingénieur.
- Irréfutation 4 : scaler en release sans épingler Xcode/Ruby/CocoaPods.
- Irréfutation 5 : simulateur + archive sur 16 Go — swap double le temps.
Thèse : la location bare metal produitise le contexte local réutilisable — M4 dédié, quota disque, runner SSH, DerivedData chaud, second nœud si besoin — médiane archive chaude environ un tiers du CI froid (≈x3), sans flag magique.
Trois piliers du x3 bare metal
x3 = même branche, même Podfile.lock, archive Release, médiane chemin chaud vs baseline « GitHub Actions froid + VPS partagé ». Les trois piliers sont interdépendants.
Pilier 1 : bare metal M4 dédié (pas VPS partagé)
Exclusivité physique : CPU, bande mémoire et écritures SSD sans interruption voisin. Contrat : arm64, DEVELOPER_DIR fixe, montage DerivedData long terme.
Pilier 2 : DerivedData chaud + chemins fixes
DerivedData n'est pas un cache optionnel. Chemins temp aléatoires ou clean rituel : 8 min chaud → 18 min froid. Créer /Users/ci/DerivedData/AppName, passer -derivedDataPath, interdire flutter clean inutile en release.
Pilier 3 : nœuds parallèles (build vs test)
Le second nœud sert la parallélisation : archive/codesign d'un côté, XCTest/simulateur de l'autre. Évite le swap 16 Go. >15 builds/jour : second M4 en location journalière souvent mieux que 24 Go seul.
Cinq surfaces : Entry / Execution / Context / Cost / Permission
Pour achat et revue d'architecture. Entry = friction ; Execution = prévisibilité archive ; Context = persistance DerivedData/Keychain/disque ; Cost ; Permission = certificats et réseau.
| Surface | Entry | Execution | Context | Cost | Permission |
|---|---|---|---|---|---|
| MacBook local | Zéro friction si matériel existant | Chaud très rapide ; voyage/coupure | DerivedData résident ; Keychain perso | Coût matériel ; peu parallèle | Certs libres ; audit faible |
| GitHub Actions hébergé | YAML | Variance à froid ; file d'attente | Contexte éphémère ; cache miss | Facturation minute ; gros repos | Bootstrap signature chaque run |
| VPS Mac partagé | Prix mensuel bas | Imprévisible ; voisins | DerivedData souvent effacé | Bon marché affiché ; attente cachée | SSH oui ; exclusivité non garantie |
| Location bare metal (M4 dédié) | PoC journalier + SSH | Archive chaude stable ; scale-out | DerivedData/Keychain persistants | Jour/semaine flexible ; ROI release | Runner auto-hébergé ; contrôle certs |
| Xcode Cloud | Intégration Apple | Pipelines standard ; peu custom | Caches Apple | Facturation compute | Signature ASC intégrée |
La plupart des « CI 3x plus lent » ont zéro en Context — pas un manque de CPU.
Froid vs chaud : benchmarks archive (exemple)
Exemple : app Flutter iOS moyenne (~180 fichiers Swift/ObjC, 12 Pods locaux), Xcode 16.x, archive Release + IPA. Minutes = médiane de dix runs.
| Environnement | Archive à froid | Archive DerivedData chaud | Notes |
|---|---|---|---|
| M4 MacBook Pro 16 Go local | 11.2 | 7.4 | Keychain perso |
| GitHub Actions macos-14 | 21.8 | 14.6 | Cache sensible au chemin/clé |
| VPS Mac partagé (4 vCPU affichés) | 19.5 | 13.1 | +30 % pic IO voisin |
| Bare metal M4 dédié (nœud unique) | 12.0 | 6.8 | derivedDataPath fixe |
| Bare metal double nœud | — | 6.8 temps mural (parallèle) | Archive et XCTest séparés |
Face à 21,8 min froid hébergé, 6,8 min bare metal chaud ≈ x3,2. Nettoyer DerivedData à chaque CI ramène au froid — on optimise le contexte.
Matrice : adopter un runner bare metal ?
Cinq profils — si deux lignes ou plus « bare metal d'abord », PoC location journalière une semaine.
| Profil | Builds/jour | Complexité signature | Recommandation | Pourquoi |
|---|---|---|---|---|
| Développeur solo | <3/jour | Cert unique | MacBook local | Contexte déjà local |
| Petite équipe Flutter | 5–15/jour | Multi-flavor + Pods | Bare metal + runner auto-hébergé | DerivedData chaud paie le plus |
| Agence multi-projets | Pic 30+/jour | Plusieurs Team ID | Double nœud bare metal | Séparer build/test, éviter swap |
| Finance/santé régulée | Moyen | HSM/audit | Bare metal + isolement réseau | Colonne Permission critique |
| Petite équipe Apple pure | Faible | ASC intégré | Xcode Cloud ou local | Suffisant si peu de custom |
Stacks recommandés A / B / C
Trois niveaux de maturité — pilote A une semaine puis B/C.
Stack A : CI hébergé + hygiène des chemins
Rester sur GitHub Actions avec -derivedDataPath, pod install --deployment, jobs signature séparés, concurrency. <5 builds/jour. 20–35 % de gain, rarement x3.
Stack B : un runner bare metal auto-hébergé
Louer un M4 dédié, runner launchd, DerivedData et Pods persistants, déclenchement GitHub/GitLab. Articles Flutter Runner et codesign pour Keychain. Équipes release stable.
Stack C : double nœud + spécialiste archive (semaine release)
Nœud principal archive chaude ; secondaire tests et notarisation. Troisième machine journalière pour hotfix. Articles Archive et mémoire swap.
Pièges que le bare metal ne corrige pas
flutter cleanou suppression DerivedData à chaque CI.Podfile.locknon commité.brew upgradeXcode sur le runner en release.- 16 Go : simulateur + archive — swap x2.
- Scripts certificats non idempotents.
- Comparer un seul meilleur run au lieu de dix médianes.
Checklist 7 étapes
- Baseline : dix archives avec timing par étape.
- Chemins fixes :
DerivedDataetPodspersistants. - PoC journalier : M4 dédié, dix runs, médiane chaude.
- Signature : utilisateur CI et Keychain selon article codesign.
- Parallèle : second nœud ou cron décalé.
- Gouvernance : alertes disque/inode et swap.
- Achat : ROI puis contrat semaine/mois.
FAQ
Les flags compilateur suffisent pour x3 ?
Peu probable. Compilation incrémentale, cache modules et link dominent.
Différence bare metal vs cloud Mac ?
Cloud Mac est une catégorie. Confirmer exclusivité physique, arm64, quota disque, DerivedData long terme.
Le cache GitHub Actions ne suffit pas ?
Il aide mais ne remplace pas un SSD chaud. Bare metal auto-hébergé rapproche du local.
Xcode Cloud est-il plus simple ?
Oui si ASC-centré et peu de custom. Sinon bare metal plus flexible.
16 Go suffisent ?
Souvent pour une archive seule ; parallèle simulateurs : 24 Go ou double nœud.
ROI visible quand ?
>8 builds/jour et 12+ min d'attente : souvent clair en une semaine PoC.
Résumé
La bonne histoire d'optimisation Xcode : préserver le contexte d'exécution. Bare metal M4 + DerivedData chaud + second nœud ≈ x3 archive chaude vs CI froid.
- Lire Context avant d'acheter CPU.
- Acheter sur médiane chaude de dix runs.
- Stack B pour la plupart ; C en release.
Prochaine étape : PoC 7 étapes une semaine et enchaîner les articles du cluster.
Besoin de runners bare metal M4 préchauffables ?
kvmboot propose du bare metal Apple Silicon dédié à la journée/semaine/mois pour archive Xcode et CI Flutter iOS.
Voir les offres · Détails de facturation · Qu'est-ce que Cloud Mac