Une chaîne de build et signature iOS/macOS sans matériel Apple

Contexte
Produire et signer du logiciel Apple (compilation, tests, signature,
soumission à l’App Store) suppose normalement un Mac. Le besoin ici était de
couvrir toute cette chaîne (xcodebuild, clang/swiftc, tests unitaires
non-UI, codesign, notarytool, packaging) sans acheter de matériel Apple :
une machine macOS virtualisée, persistante, pilotée entièrement en ligne de
commande sur un hôte Linux.
Contraintes techniques
La contrainte dure, et non contournable : aucun GPU accéléré n’existe en virtualisation macOS moderne. macOS ne prend en charge aucun GPU NVIDIA depuis High Sierra, et l’iGPU de l’hôte n’est pas davantage supporté — le rendu reste logiciel. Cette limite matérielle irréductible détermine en cascade une bonne partie des choix qui suivent, à commencer par le modèle de machine émulé, et rend hors de portée plusieurs usages :
Accélération graphique native
Bloquée par l’absence de GPU exposé à la VM — la limite matérielle qui détermine cette liste.
Simulateur iOS
Indisponible pour la même raison matérielle.
Previews d’interface
Indisponibles pour la même raison matérielle.
Outils de profilage GPU
Sans objet pour la même raison matérielle.
L’identité de la machine virtuelle est par ailleurs un identifiant de test au format valide, mais délibérément non vérifié auprès d’Apple. Conséquence directe et annoncée : les services liés au compte Apple (messagerie, appels, synchronisation cloud) ne fonctionnent pas, et aucun contournement n’est proposé. Ce choix n’affecte en revanche ni la compilation, ni la signature, ni la soumission — ces opérations reposent sur le compte développeur et les certificats, pas sur l’identité machine.
Troisième limite, documentée dans un audit de reproductibilité dédié : cinq opérations ne s’automatiseront jamais complètement (l’installation graphique initiale de macOS, un téléchargement derrière une session authentifiée, quelques écrans du portail développeur).
Démarche
Un dépôt a été créé pour documenter et reproduire l’ensemble des étapes, chacune documentée selon un même format avec pour objectif : état des lieux, procédure, valeurs et justifications, vérification, mode d’échec, retour arrière. Plusieurs blocages techniques réels ont dû être résolus, avec preuve à l’appui à chaque fois :
Démarrage bloqué sans message exploitable
Un modèle de CPU QEMU proche mais inadapté empêchait XNU de démarrer avant même l’initialisation de la console noyau. Diagnostic par introspection du modèle de CPU exposé, correction du modèle et du masquage de topologie.
Journal de démarrage silencieux
Router les journaux noyau vers le port série demande un indicateur de debug spécifique en plus de l’option série elle-même — sans lui, aucune trace, donc aucun diagnostic possible sur les blocages suivants.
Panique noyau, identité machine et masquage
Le SMBIOS choisi (une classe de machine sans iGPU, précisément pour éviter un conflit avec l’absence de GPU) entrait en conflit avec une option de compatibilité activée par ailleurs, chargée après la mise en cache du noyau. Contournement construit sur mesure : un composant système factice généré par script, sans binaire réel, qui prend la priorité sur le composant problématique.
Xcode présent mais plateforme absente
La commande standard de téléchargement de plateforme restait bloquée indéfiniment sur cette configuration. Diagnostic par échantillonnage de processus, puis contournement manuel complet : lecture du catalogue Apple, téléchargement direct, vérification d’intégrité croisée, déchiffrement et extraction, installation par l’outil de runtime.
Signature à distance sans session graphique
Le trousseau de clés ne se déverrouille pas de lui-même : il faut le déverrouiller et compiler dans la même session distante, sinon la signature échoue sans message clair.
Réalisations
Chaîne CLI complète
Build, tests non-UI, signature, notarisation et soumission App Store, sans matériel Apple, pilotée entièrement en ligne de commande.
Documentation reproductible
Chaque étape documentée selon un même format : état des lieux, procédure, vérification, mode d’échec, retour arrière.
Cinq blocages techniques réels résolus
Chacun diagnostiqué et corrigé avec preuve à l’appui.
Validation de bout en bout
Build, signature et dépôt réussis sur App Store Connect, jusqu’à l’acceptation réelle par Apple.
Audit de reproductibilité
Reprise complète sur une autre machine mesurée à environ une demi-journée ; un défaut trouvé pendant l’audit (sauvegarde manquante de l’identité de signature) corrigé en direct. Temps de compilation de référence mesuré à moins de trois minutes.