Accueil / Blog / Kotlin Multiplatform iOS CI : hébergé ou auto-hébergé en 2026 ?
ENGINEERING_BLOG · 2026.08.27

Kotlin Multiplatform iOS CI : hébergé ou auto-hébergé en 2026 ?

Au 27 août 2026, Apple présente encore Xcode 27 comme une version bêta dans ses informations officielles sur les exigences système référencées par Apple. Pour un projet Kotlin Multiplatform, cela suffit à écarter une décision fondée sur un seul type de nœud.

Symptôme → vos vérifications de code, builds iOS, simulateurs et publications se disputent le même environnement macOS, tandis que les secrets et les dépendances privées élargissent le périmètre de risque.

Solution la plus rapide → utilisez un agent macOS hébergé pour les contrôles PR et les pics de compilation, mais réservez un Mac distant dédié à la signature de production, aux dépendances privées et à la version Xcode que vous devez figer. Si la charge varie, adoptez une base fixe de production avec une capacité hébergée élastique.

Cette approche correspond à la séparation proposée dans les instructions officielles de CI/CD pour Kotlin Multiplatform, sans transformer un exemple de documentation en garantie universelle de compatibilité.

SECTION 01Quelle charge doit aller sur quel nœud macOS ?

Vous ne devez pas commencer par demander si le Kotlin Multiplatform iOS CI doit être hébergé ou auto-hébergé. Commencez par classer la tâche. Un test du module partagé, une compilation iosArm64, une exécution sur simulateur et une archive destinée à TestFlight ne prouvent pas la même chose et n’ont pas le même périmètre de confiance.

Scénario de travail Environnement recommandé Ce que le résultat permet d’affirmer Limite à contrôler
Vérifications du code partagé et tests Kotlin Agent non macOS lorsque les dépendances le permettent Le code commun et ses tests passent Aucun produit iOS réel n’est accepté
Compilation de framework Apple Agent macOS hébergé ou Mac distant Une cible Apple est compilée avec les outils requis Version Xcode, cache et architecture à reproduire
Validation avec simulateur Agent macOS préparé ou Mac distant dédié L’application démarre sur une cible de simulation choisie Le simulateur ne remplace pas un appareil physique
Archive et signature de distribution Mac distant dédié recommandé Un artefact distribuable est produit avec les droits attendus Certificats, trousseau, clé API et journaux
Dépendances internes et sortie réseau contrôlée Nœud privé ou distant explicitement autorisé Le build atteint les services nécessaires Proxy, dépôt d’artefacts, résidence des données et nettoyage

Cette matrice répond aussi à une question fréquente : un projet Kotlin Multiplatform peut-il compiler iOS sans Mac ? Les contrôles communs, certains tests et les étapes de transformation peuvent être déplacés hors de macOS. Dès que votre pipeline appelle les outils Apple pour construire, simuler, archiver ou signer une application iOS, vous devez prévoir un environnement macOS compatible.

Les cibles iosArm64 et iosSimulatorArm64 ne servent pas au même objectif. La première vise le matériel iOS réel, tandis que la seconde correspond à la simulation sur Apple Silicon. La documentation Kotlin sur les binaires natifs décrit cette génération de binaires ; votre pipeline doit ensuite vérifier que chaque cible nécessaire est réellement produite et consommée.

Le cas d’une équipe audio, vidéo ou design

Dans une équipe qui développe un outil audio, un éditeur vidéo ou une application de design, le module partagé peut passer ses tests alors que l’intégration iOS échoue au chargement d’un framework, à l’ouverture d’une ressource graphique ou lors d’une opération de simulation. Un agent hébergé est pratique pour multiplier les validations, mais une machine dédiée peut conserver des caches, des projets d’exemple et des outils de prévisualisation difficiles à reconstruire à chaque tâche.

L’erreur de gouvernance consiste à déclarer la branche « verte » sur la base des seuls tests Kotlin. Pour autoriser une fusion, définissez séparément le niveau « code partagé validé », le niveau « application iOS compilée » et le niveau « archive signée acceptée ».

SECTION 02Le découpage des tâches avant de réserver du Mac

Le premier gain ne vient pas de l’ajout immédiat de machines. Il vient du découpage des tâches. Vous évitez ainsi de consommer un nœud macOS pour une vérification qui n’appelle aucun outil Apple, tout en conservant une preuve claire de ce qui a réellement été testé.

Étape de pipeline Peut sortir de macOS ? Preuve attendue Nœud conseillé
Analyse statique et formatage du code commun Souvent oui Rapport d’analyse attaché au changement Agent générique
Tests du module partagé Selon les bibliothèques utilisées Résultats de tests et rapport d’échec Agent générique ou macOS
Compilation iosArm64 Non pour une chaîne Apple complète Framework ou produit compilé Agent macOS
Compilation iosSimulatorArm64 Non Application ou framework de simulation Agent macOS avec simulateur préparé
Test d’interface et démarrage Non Journal du simulateur et captures d’échec Agent macOS spécialisé
Archivage et export Non Archive exportée, empreinte et journal Mac distant dédié
Publication TestFlight Non Identifiant de build, réponse de publication et audit Nœud de production isolé

La documentation de découverte de projet Kotlin Multiplatform doit être utilisée pour vérifier la structure et les cibles de votre projet, mais elle ne remplace pas votre propre test de chaîne complète. Une configuration valide sur le papier peut encore échouer à cause d’une dépendance native, d’un script d’export ou d’une incompatibilité entre outils.

Votre règle de fusion devrait donc comporter trois statuts distincts :

  • Contrôle commun réussi : le code partagé peut être examiné, mais l’artefact iOS n’est pas encore accepté ;
  • Build Apple réussi : la cible demandée compile avec la version d’outils retenue ;
  • Livraison acceptée : l’archive, la signature et le comportement attendu ont été vérifiés.

Un agent macOS hébergé est particulièrement adapté aux deux premiers statuts lorsque les jobs sont indépendants et que la capacité doit suivre le volume de pull requests. Les caractéristiques des exécuteurs macOS hébergés doivent toutefois être vérifiées au moment du choix : image disponible, version Xcode, architecture, accès réseau, stockage temporaire et politique de conservation.

SECTION 03Quand un Mac distant dédié devient-il préférable ?

Le Mac distant ne doit pas être présenté comme automatiquement plus sûr. Il vous donne davantage de contrôle sur le compte, le trousseau, la version Xcode, les caches et la sortie réseau ; ce contrôle devient un avantage seulement si vous l’accompagnez de règles d’exploitation vérifiables.

Critère de décision Agent macOS hébergé Mac distant dédié
Variation du nombre de jobs Très adapté à la capacité à la demande Capacité limitée au nombre de machines
Version Xcode figée sur une longue période À confirmer sur chaque image Contrôle direct de l’environnement
Caches et dépendances volumineuses Conservation variable selon le service Conservation configurable, avec nettoyage obligatoire
Dépôt privé ou proxy interne Possible uniquement si le réseau l’autorise Plus simple à intégrer dans une zone contrôlée
Secrets de distribution À limiter à un job très ciblé Périmètre isolable, mais administration à votre charge
Panne ou redémarrage Dépend du remplacement automatique Vous devez tester la reprise et l’accès distant
Coût de base Facturation généralement liée aux tâches ou à l’usage Coût lié à la possession ou à la location du nœud
Maintenance Faible côté matériel Systèmes, comptes, mises à jour et nettoyage à gérer

Pour choisir entre un agent macOS hébergé et un nœud auto-hébergé, posez quatre questions concrètes :

  1. La tâche a-t-elle besoin d’un accès privé qui ne peut pas être accordé à un environnement partagé ?
  2. La version Xcode doit-elle rester fixe pendant une période de publication définie ?
  3. Les secrets de distribution doivent-ils rester dans une zone séparée des validations de code ?
  4. Une interruption du nœud peut-elle bloquer une livraison qui ne peut pas attendre la remise en service ?

Si vous répondez « oui » aux trois dernières questions, le Mac distant dédié devient le choix prudent pour cette charge précise. Cela ne signifie pas que toute la chaîne doit y être déplacée.

Deuxième étape : figer l’environnement sans bloquer l’évolution

Conservez une image ou une procédure de configuration documentée pour chaque ligne de build. Notez la version Xcode, le SDK utilisé, les versions Kotlin et des plugins, l’architecture visée, les variables nécessaires et la commande d’archivage. Pour Xcode 27, ne déduisez pas une compatibilité de production de son seul numéro : Apple le classe encore en bêta à la date de vérification indiquée plus haut.

Maintenez ensuite deux voies :

  • une voie stable, utilisée pour les publications approuvées ;
  • une voie d’essai, destinée à vérifier une nouvelle version Xcode ou une mise à jour Kotlin sans toucher aux secrets de production.

Cette séparation permet à une équipe de design de tester une nouvelle intégration graphique, ou à une équipe vidéo de contrôler la lecture et l’export d’un média, sans exposer la chaîne de livraison principale à une mise à niveau prématurée.

SECTION 04Comment protéger la signature et les dépendances privées ?

Une compilation réussie ne dit rien de la qualité de votre frontière de sécurité. Pour publier sur TestFlight, vous devez traiter séparément la clé API App Store Connect, le certificat de distribution, le profil ou les paramètres de signature, le trousseau macOS et les droits du compte de service. La procédure Apple de téléversement des builds décrit l’opération de livraison ; elle ne dispense pas votre entreprise de définir qui peut déclencher cette opération.

Le flux recommandé est le suivant :

validation de code → build sans secret de distribution → approbation → nœud de publication isolé → archivage → téléversement → nettoyage

Appliquez une table de droits minimale :

Élément sensible Validation PR Build interne Publication
Accès au dépôt source Oui, selon le dépôt Oui Oui, limité au projet
Certificat de distribution Non Non, sauf besoin démontré Oui
Clé API App Store Connect Non Non Oui, droits minimaux
Trousseau de signature Non Éventuellement séparé Oui, verrouillé au job
Dépôt d’artefacts interne Lecture si nécessaire Lecture et écriture contrôlées Lecture de l’artefact validé
Accès au réseau privé Non par défaut Selon la dépendance Selon la dépendance

Une architecture hébergée peut réaliser une publication signée, mais vous devez examiner la durée de vie des secrets, les journaux, l’effacement du workspace et la possibilité de limiter le déclenchement à une branche protégée. Les recommandations officielles sur la sécurisation des workflows et des secrets constituent un point de contrôle utile.

Pour une dépendance privée, ne donnez pas davantage de privilèges au nœud simplement parce que le build échoue. Identifiez plutôt le besoin exact : dépôt de code, registre de paquets, proxy, service de licences ou adresse de sortie fixe. Sur un Mac distant, vérifiez l’isolement des comptes, le nettoyage du répertoire de travail, les journaux d’accès, le redémarrage sans intervention et le comportement après coupure réseau.

Rappel d’exploitation : un nœud dédié est contrôlable, mais il n’est pas sécurisé par nature. Sans nettoyage vérifiable, rotation des secrets, compte séparé et procédure de reprise testée, vous avez seulement déplacé le risque.

SECTION 05La capacité hybride qui résiste aux pics

La capacité doit être calculée par scénario et non par le nombre total de développeurs. Mesurez séparément la charge quotidienne de PR, les publications groupées, les essais de version Xcode et les reprises après panne. Les exécuteurs auto-hébergés donnent un contrôle accru, mais la documentation sur leur administration rappelle implicitement que l’entretien, la sécurité et la disponibilité restent à votre charge.

Utilisez ce modèle sans préremplir de montant :

  • Capacité fixe de production = nombre de publications simultanées acceptées + marge de reprise ;
  • Capacité hébergée de pointe = jobs simultanés au pic − capacité fixe disponible ;
  • Dépense de calcul = durée cumulée des jobs hébergés × tarif applicable ;
  • Coût du nœud dédié = location ou possession + administration + stockage + surveillance ;
  • Coût d’interruption = durée de blocage × coût interne d’une équipe immobilisée.

Troisième étape : mesurer avant d’augmenter le parc

Pendant une période représentative, enregistrez pour chaque tâche :

  • l’heure d’entrée et de sortie de la file ;
  • la durée de compilation et la durée de simulation ;
  • le nombre d’échecs liés à l’environnement plutôt qu’au code ;
  • la durée nécessaire pour restaurer un nœud indisponible ;
  • le nombre de publications nécessitant une intervention humaine.

Vous pouvez alors comparer trois modèles.

Tout hébergé convient si vos tâches sont courtes, peu dépendantes du réseau privé et compatibles avec les images disponibles. Ses avantages sont la réduction de l’administration matérielle et l’absorption des pics. Ses limites sont la dépendance aux images proposées, la variabilité des caches et un contrôle plus restreint de l’environnement.

Tout auto-hébergé convient si vos contraintes réseau, de résidence des données ou de version Xcode dominent la décision. Ses avantages sont la maîtrise du nœud et la séparation des secrets. Ses limites sont la capacité immobilisée, les mises à jour, le remplacement en cas de panne et la responsabilité complète de la reprise.

L’hybride est le choix le plus défendable lorsque la production doit rester prévisible tandis que les PR et les campagnes de test fluctuent. Gardez un Mac distant dédié pour l’archive et la signature, puis utilisez des agents hébergés pour absorber les compilations non sensibles. Le contrôle des déploiements peut compléter cette séparation en imposant une approbation avant la phase de publication.

SECTION 06Procédure de mise en service en cinq contrôles

Première étape : inventorier les preuves attendues

Écrivez la liste des artefacts nécessaires pour chaque scénario : rapport de tests communs, framework Apple, application de simulation, archive, journal de signature et confirmation de téléversement. Si une tâche ne produit aucune preuve exploitable, elle ne doit pas être considérée comme un contrôle de livraison.

Deuxième étape : associer chaque tâche à une cible

Déclarez explicitement iosArm64, iosSimulatorArm64 et les autres cibles réellement nécessaires au projet. Refusez le raccourci consistant à compiler une seule architecture puis à annoncer que la chaîne iOS est validée.

Troisième étape : préparer deux environnements macOS

Configurez un agent pour les builds fréquents et un Mac distant isolé pour les opérations sensibles. Vérifiez la version Xcode, les outils de ligne de commande, les dépendances, les certificats non productifs et l’accès au simulateur avant d’introduire les secrets de distribution.

Quatrième étape : tester les frontières réseau et les secrets

Lancez un build avec des identifiants factices ou limités. Contrôlez les journaux, les variables exposées, les fichiers temporaires, l’accès au dépôt privé et la suppression du workspace. Ne validez pas un nœud parce qu’il compile uniquement sur le réseau interne de l’administrateur.

Cinquième étape : simuler panne et reprise

Coupez l’accès au nœud distant, interrompez un job et forcez un redémarrage contrôlé. Mesurez le temps nécessaire pour reprendre une publication, puis documentez qui peut intervenir. Si la reprise dépend d’un compte personnel, votre architecture n’est pas prête pour une exploitation d’équipe.

Pour organiser cette phase, vous pouvez consulter le guide de validation d’un nœud Mac distant pour CI iOS, puis examiner les modalités de location de Mac pour un environnement de test. Ces liens doivent servir à préparer un essai mesuré, non à remplacer vos critères d’acceptation.

SECTION 07FAQ : les décisions qui bloquent souvent un projet

Un projet Kotlin Multiplatform peut-il compiler iOS sans Mac ?

Les tests et contrôles communs peuvent souvent s’exécuter sur un environnement non macOS. En revanche, la compilation de cibles Apple, la génération de frameworks iOS, la validation avec le simulateur, l’archivage et la signature nécessitent un environnement macOS avec les outils Apple appropriés. Vous ne devez donc pas confondre la validation du code partagé avec l’acceptation d’un véritable produit iOS.

Faut-il choisir un agent macOS hébergé ou auto-hébergé ?

Pour les vérifications de pull request, les builds iOS reproductibles et les besoins variables, un agent macOS hébergé est généralement plus simple à faire évoluer. Un Mac distant auto-hébergé convient mieux lorsque vous devez conserver une version Xcode précise, atteindre des dépendances privées, maintenir des caches ou isoler la signature de production. Une architecture hybride couvre souvent les deux contraintes.

Comment isoler les identifiants de signature avant une publication TestFlight ?

Séparez les workflows de validation et de publication, puis limitez la clé API App Store Connect, le certificat de distribution et le trousseau au seul nœud de mise en production. Utilisez un compte de service dédié, interdisez la réutilisation des secrets dans les tâches de test et journalisez chaque accès. La suppression de l’espace de travail après publication doit être vérifiée, pas simplement déclarée.

Comment dimensionner la capacité macOS d’une équipe Kotlin Multiplatform ?

Commencez par mesurer la file d’attente, la durée des builds, le nombre de validations simultanées et la fréquence des publications. Conservez une capacité fixe pour la production, puis ajoutez des agents hébergés lors des pics de pull requests, des campagnes de simulation ou des essais de nouvelle version Xcode. Validez ensuite le modèle avec des données de récupération et d’interruption réelles.

Le choix « tout hébergé » reste fragile lorsque vos builds dépendent d’un réseau privé, d’une version Xcode en bêta ou de secrets de distribution réutilisés par plusieurs applications. Le choix « tout auto-hébergé » vous expose à une capacité inutilisée, à la maintenance des comptes et à un point de panne matériel ou administratif. Dans ces conditions, louer un Mac distant auprès de MACNOX pour le nœud de production ou le pilote KMP vous permet surtout de mesurer la file, la compilation, la signature et la reprise sur une machine réelle, avant de décider si cette capacité doit devenir permanente. Consultez ensuite les options de Mac distant avec vos propres critères d’acceptation plutôt qu’avec une promesse théorique d’économie.

SECTION 08Pour aller plus loin