2026 Flutter & React Native CI : quelles étapes sur macOS cloud vs Linux — matrice hybride et paramètres
Les équipes qui traitent l’iOS comme une CI Linux générique gaspillent souvent des minutes macOS ou masquent des échecs réels derrière des relances bruyantes. Cet article liste trois irritants, une matrice de phases Linux/macOS pour Flutter et React Native, sept étapes de déploiement (tags, artefacts), des seuils réutilisables en revue d’architecture et une FAQ pointant les guides VPSMAC sur les limites Linux/iOS et le multi-Xcode. Vous pourrez ensuite dimensionner uniquement la tranche iOS.
Dans cet article
1. Trois problèmes lorsque iOS est programmé comme Linux
Monorepos partage Dart, TypeScript et linters sur toutes les plates-formes, ce qui encourage les ingénieurs de plate-forme à réutiliser une seule grande matrice. Xcode 26 et SwiftPM supposent toujours macOS pour tout ce qui touche à la véritable chaîne de signature, de sorte qu'un mauvais placement se manifeste sous la forme de caches instables ou d'erreurs réseau mystérieuses au lieu d'un signal clair de chaîne d'outils manquant. Cette habitude est compréhensible car les voies Android semblent identiques aux tâches backend, mais les voies iOS sont plus proches des pipelines de micrologiciels qui exigent un noyau spécifique et des hypothèses d'éléments sécurisés.
Une fois que vous avez internalisé cette différence, les conversations sur les coûts deviennent plus faciles, car vous pouvez afficher la mise à l'échelle Android de manière linéaire avec des processeurs virtuels bon marché, tandis que la mise à l'échelle iOS suit le stockage rare connecté à T2 et les chaînes d'outils signées Apple.
- L'inadéquation des étapes étend le tri : l'exécution de scripts presque macOS sur Ubuntu produit de longs journaux non pertinents. Les astreintes alternent entre les théories des certificats et les lacunes d'image, tandis que la capacité MacOS payante reste inactive ou est ensuite gaspillée dans des emballages en double.
- Les artefacts manquent de contrats : lorsque les binaires du moteur, les sorties Hermes ou les dossiers codegen omettent la version minimale de Xcode et les métadonnées de tranche, les archives échouent tardivement. Les restaurations invalident alors les vérifications vertes de Linux et créent une fausse confiance dans la préparation à la publication.
- Les files d'attente et les disques explosent uniquement sur Mac : une balise générique
mobilepermet aux archives Android lourdes de voler les rares emplacements macOS. Sans unDERIVED_DATA_PATHpar branche, les branches parallèles peuvent réduire l'espace libre APFS à un seul chiffre, ce que les propriétaires de Linux ont interprété à tort comme un outil Apple instable au lieu d'un bug de planification.
La matrice ci-dessous sépare le travail qui devrait rester sous Linux du travail qui doit atterrir sur les cloud runners SSH Mac afin que la finance puisse financer précisément la tranche iOS.
2. Matrice de scène pour Flutter et React Native
Utilisez ce tableau comme référence pour 2026 ; si vous expérimentez avec des conteneurs prétendant remplacer macOS pour iOS, lisez d'abord l'article sur les limites de Linux pour éviter les raccourcis illégaux.
| Scène | Exemples de flottement | Exemples de réaction native | Système d'exploitation | Remarques |
|---|---|---|---|---|
| Analyse statique et tests VM | dart analyze, VM uniquement flutter test | ESLint, Jest sans ponts natifs | Linux | Noyaux à diffusion élevée et bon marché |
| Analyse des pods et de Xcodeproj | Enregistrement du plugin avant flutter build ios | bundle exec pod install | macOS | Nécessite une résolution Xcode |
| Archiver, IPA, téléchargement ASC | flutter build ipa, xcodebuild archive | xcodebuild plus Fastlane | macOS | Véritable chaîne de signature |
| Travail de l'interface utilisateur du simulateur | Tests d'intégration sur Simulateur | Détox iOS, XCUITest | macOS | Headless a toujours besoin de la pile Simulator |
| Emballage Android | flutter build appbundle | Pipeline Gradle | Linux ou conteneurs | Isoler les balises d'iOS |
linux-mobile and mac-ios-only instead of one overloaded mobile tag.
3. Sept étapes de déploiement
Supposons que les Cloud Runners Mac auto-hébergés ou loués soient déjà accessibles via SSH. Si vous ne disposez pas d'une référence d'image idéale, capturez le triple d'en-tête du guide multi-Xcode avant de régler la simultanéité.
- Épingler les chaînes d'outils : documenter les versions Xcode et Flutter attendues ; imprimez
xcodebuild -versionetflutter --versionau début de chaque tâche macOS. - Protégez les tâches Linux : court-circuitez
pod installavec les indicateurs d'environnement afin qu'Ubuntu ne prétende jamais être un hôte signataire. - Réduire les entrées Mac : téléchargez uniquement les fichiers de verrouillage et les bundles intermédiaires à partir de Linux au lieu de télécharger à nouveau l'intégralité de l'archive tar de l'espace de travail.
- Isoler les données dérivées : exemple
DERIVED_DATA_PATH=$CI_WORKSPACE/dd/ios/$CI_COMMIT_SHORT_SHA; nettoyer en utilisant les mêmes seuils de disque que l'article sur la file d'attente de construction. - Sérialiser le bundler et le compilateur : lorsque Hermes et Xcode partagent un nœud, séparez les répertoires de cache pour éviter les pics de contention APFS.
- Deux niveaux CI : les requêtes de fusion exécutent un
build-for-testingléger ; les branches de publication gèrent des archives complètes la nuit. - Signaux Runbook : après chaque modification YAML, suivez la file d'attente macOS p95, l'horloge murale et le pourcentage d'espace libre ; restaurez YAML avant de patcher à chaud les nœuds.
4. Seuils pour les examens de 2026
Tout d’abord, réservez environ quatre-vingt-dix à cent vingt gigaoctets d’espace libre maximal pour une archive monorepo moyenne typique comprenant le staging DerivedData et dSYM ; échoue rapidement en dessous d'environ douze pour cent utilisables pour arrêter les nouvelles archives avant que les erreurs de métadonnées APFS n'apparaissent. Deuxièmement, lorsque le nombre d'emplacements macOS reste inférieur à un quart de la profondeur de file d'attente soutenue, l'attente p95 dépasse généralement trois fois la durée médiane du test unitaire, ce qui signifie que vous devez ajouter de la capacité Mac avant de réduire les peluches Linux. Troisièmement, sans Bitcode hérité, attendez-vous à dix-huit à trente-cinq minutes par archive en fonction des macros Pods et Swift. Quatrièmement, les versions RN compatibles Hermes affichent souvent un processeur moyen d'environ un virgule quatre à un virgule huit fois par rapport à une étape Linux JVM pure, donc plafonnez la concurrence mac-ios-only séparément. Cinquièmement, conservez un seul ensemble d’artefacts iOS de pipeline entre environ deux et six gigaoctets en divisant les symboles de l’IPA pour éviter que les minutes de téléchargement ne consomment le budget macOS.
Deux autres numéros faciles à examiner aident à financer les conversations. Le taux de réussite du cache pour les téléchargements de dépendances sur macOS devrait rester supérieur à environ soixante-dix pour cent d'une semaine à l'autre ; une baisse soudaine signifie généralement que quelqu'un a dirigé la tâche iOS vers un nouveau volume éphémère sans restaurer les caches CocoaPods ou Pub, ce qui ajoute huit à quinze minutes de temps de mur par tâche. Suivez également le décalage d'horloge du coureur entre les étapes Linux et Mac ; plus d'environ deux secondes de décalage entre les horodatages de signature des artefacts et les API de téléchargement ASC peuvent déclencher des échecs d'authentification sporadiques qui ressemblent à des pannes Apple aléatoires jusqu'à ce que NTP soit corrigé.
Enfin, documentez à qui appartient la restauration lorsqu'une mauvaise modification de YAML augmente la profondeur de la file d'attente macOS : l'ingénierie de la plate-forme doit d'abord annuler les définitions de pipeline, car les correctifs de nœuds sans restauration de YAML recréent des flocons de neige cachés dans toute la flotte.
5. FAQ
pod install peut-il fonctionner sous Linux pour gagner des minutes ?
Uniquement lorsqu'aucun hook Podspec ne nécessite une analyse Xcode ; la plupart des applications RN de production devraient toujours exécuter des CocoaPods sur macOS, sinon les échecs se regrouperont au moment de l'archivage.
La cible Linux du bureau Flutter est-elle importante ici ?
Non; les cibles de bureau méritent leur propre pool de coureurs et ne doivent pas voler les balises iOS.
Quel est le rapport avec l'article multi-Xcode ?
Ce guide possède la coexistence de xcode-select et du SDK ; ce guide possède les divisions d'étapes multi-OS et l'hygiène des balises. Mettez à niveau les deux runbooks ensemble.
6. Choisir le substrat Mac sous une topologie hybride
Les ordinateurs portables et les postes de travail distants occasionnels peuvent fournir une version, mais ils brisent trois propriétés de production : une disponibilité nocturne imprévisible, des lignes de base Xcode qui ne correspondent jamais à un SLO partagé et des configurations de proxy ou de certificat d'entreprise qui ne peuvent pas être clonées dans CI. Linux reste la couche de calcul générique dense tandis que les nœuds macOS remplaçables forment la tranche spécifique à Apple. Essayer de simuler des sorties iOS sans macOS natif gaspille des minutes en journaux inutiles au lieu de compiler du code. Pour les équipes qui ont besoin de files d'attente prévisibles, d'un accès SSH élastique et de politiques de disque écrites en parallèle des SLO Linux, la location d'hôtes cloud VPSMAC M4 Mac est généralement plus stable que la compression de machines personnelles mixtes : les images, les règles DerivedData et les hooks d'observabilité s'alignent sur les articles VPSMAC sur la migration SSH, les pools multi-Xcode et la télémétrie Mac CI.