Systèmes · Virtualisation · Outillage mobile

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

Architecture : hôte Linux, invité macOS virtualisé, chaîne jusqu’à l’App Store

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.

Blocages résolus

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.

Compétences exercées sur ce projet

Debian 13 · KVM / QEMU · libvirt · OpenCore · macOS Sequoia · Xcode / xcodebuild · Bash + Python

Un besoin similaire ?

Parlons de votre projet