DevOps / CI·CD 10 avril 2026

xcodebuild test sur simulateur iOS sur Mac cloud headless loué (2026)

Équipe technique MacXCode ~18 min de lecture

Les équipes qui louent un Mac cloud Apple Silicon bare-metal à Hong Kong, au Japon, en Corée, à Singapour ou aux États-Unis automatisent souvent en SSH seul. Après CLT vs Xcode complet et la discipline des jobs parallèles, l’étape suivante est souvent XCTest sur simulateur iOS sans ferme d’appareils. Ce guide 2026 décrit xcodebuild test sur hôte headless : -destination stables, consommation NVMe (1 TB vs 2 TB), et UI tests sans session graphique. À lire avec Archive à distance et caches de dépendances.

Pourquoi des tests simulateur sur un Mac cloud dédié ?

  • Parallélisme — beaucoup de simulateurs logiques plus vite que l’USB pour les suites unitaires.
  • Matrice OS reproductible — figer iOS 18.x et iOS 17.x sans matériel par version.
  • Géographie — lancer les tests près des mocks API (SG, US) et des contraintes conformité.
  • Coût — les minutes simulateur n’occupent pas les slots appareil ; budgéter le NVMe quand même.
Règle : traiter les images simulateur comme des couches Docker — épingler les runtimes dans le YAML CI, journaliser xcrun simctl list runtimes, alerter si l’espace libre < 50 GB sur builders partagés.

Réalité headless (sans VNC)

CoreSimulator et XCTest tournent souvent sans WindowServer ; les tests qui supposent la géométrie écran, SpringBoard ou caméra/micro peuvent exiger une courte session VNC pour diagnostiquer — pas chaque nuit. Préférer des identifiants d’accessibilité, désactiver les animations, éviter les sleep liés au rendu.

Signal : si les échecs suivent des reboots de maintenance 02:00–04:00 locaux, attendre simctl bootstatus vert avant xcodebuild test.

Chaînes -destination stables

La CI instable vient souvent du « dernier iPhone » qui change après mise à jour Xcode. Encoder major/minor OS ; pour n’importe quel simulateur compatible, préférer une destination plateforme générique :

xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16,OS=18.2' -derivedDataPath /tmp/dd-$BUILD_ID

Après upgrade Xcode, relancer xcrun simctl list devices available et mettre à jour les variables pipeline. Les équipes JP et KR gardent les mêmes noms d’appareil en anglais.

Checklist CI en sept points

  1. Xcode complet si SwiftUI Previews ou bundles simulateur spécifiques.
  2. DEVELOPER_DIR explicite si plusieurs Xcode sur la machine louée.
  3. Nouveau -derivedDataPath par job pour éviter le cross-talk avec Archive.
  4. Boot du simulateur dans un script setup ou laisser xcodebuild — ne pas supposer l’état d’hier.
  5. -resultBundlePath ou -enableCodeCoverage YES selon le tableau de bord.
  6. Archiver .xcresult compressé ; conserver 14 jours minimum.
  7. En cas d’échec de boot simulateur, joindre simctl diagnose.

Matrice : simulateur vs appareil physique

Besoin Simulateur Appareil
Tests unitaires / logique rapides ✓ Forte parallélisation par hôte Excessif ; friction UDID/câble
Metal / caméra / push réalistes Fidélité limitée ✓ Labo d’appareils ou matériel local
Provisioning / signature Bon premier garde-fou ✓ Souvent requis avant App Store

Budget NVMe : 1 TB vs 2 TB

Poste Ordre de grandeur Atténuation
Image runtime iOS 8–15 GB / version majeure Garder seulement les runtimes de la matrice
DerivedData + ModuleCache / job 3–25 GB Supprimer /tmp/dd-* > 7 jours
Données appareil simulateur Croît avec les suites UI simctl delete unavailable hebdomadaire

Trois versions iOS × cinq schemes sur un Mac mini M4 : 2 TB évite souvent les rouges « disque plein » — voir les tarifs avant quatre Xcode en parallèle.

Symptômes et premiers contrôles

Symptôme Vérifier Action
Unable to boot device Espace disque ; CoreSimulatorService zombie Reboot ou killall -9 com.apple.CoreSimulator.CoreSimulatorService
Destination introuvable Runtime supprimé après patch Réinstaller la plateforme ; mettre à jour le YAML
Timeout UI seulement en SSH Animations ; SpringBoard Désactiver animations ; timeout de lancement avec prudence

FAQ

Question Réponse
Mélanger tests simulateur et Archive sur un user ? Oui avec -derivedDataPath isolé et files d’attente du guide builds parallèles.
VNC à chaque échec ? Non — seulement si les logs indiquent un problème WindowServer.
Déboguer sans ralentir la CI ? Reproduire sur staging avec le guide SSH, pas sur le builder prod.

Pourquoi le Mac mini M4 MacXCode convient

Charge simulateur = CPU, bande passante RAM et I/O aléatoire. Mac mini M4 loué : mémoire unifiée, NVMe rapide, moins de voisins bruyants qu’un VM surchargé — idéal HK · JP · KR · SG · US. Deuxième nœud quand les suites UI doublent. SSH pour l’automation, VNC en dernier recours visuel.

1 TB avec pruning agressif ; 2 TB plus confortable multi-équipes. Nœuds et stockage ; avec runners GitHub Actions si orchestration cloud.

En bref : xcodebuild test headless est viable en prod si vous épinglez les destinations, isolez DerivedData et budgétisez le disque simulateur. Ensuite : signature à distance avant TestFlight.

Mac cloud : simulateur + Archive

HK · JP · KR · SG · US · jusqu’à 2 To NVMe