Le 8 septembre 2026, Tuist a documenté une évolution de réutilisation par blocs pour son cache Xcode, sans promettre un gain identique pour tous les projets (changelog officiel de Tuist). Compilation répétée → essayez d’abord Tuist Xcode Cache ; attente d’un nœud, tests d’interface ou signature → ajoutez ou séparez des Mac distants ; les deux symptômes → adoptez une double piste.
Ce guide s’adresse aux équipes qui maintiennent un grand projet iOS ou macOS et veulent réduire la recompilation des mêmes dépendances et sources. Il concerne aussi les ingénieurs DevOps qui doivent distinguer une exécution lente d’une file d’attente, ainsi que les responsables de plateforme qui arbitrent entre optimisation, location et capacité supplémentaire.
Dernière mise à jour : 15 septembre 2026. Les informations ont été vérifiées dans le guide Tuist Xcode Cache, son journal des modifications, la documentation Apple sur les compilations incrémentales et les règles de routage des Runner du fournisseur CI concerné.
SECTION 01Le premier diagnostic doit séparer cinq temps
Avant de modifier le pipeline, ne mesurez pas seulement la durée totale d’un travail. Cette valeur mélange des causes qui ne se traitent pas avec le même outil :
- l’attente avant l’attribution d’un Runner ;
- le démarrage et la préparation de l’environnement ;
- la compilation froide ou incrémentale ;
- le téléversement et le téléchargement des produits du cache ;
- les tests, l’archivage, la signature et la remise du résultat.
Apple recommande d’examiner les temps de construction afin d’identifier les tâches qui ralentissent réellement une compilation incrémentale (documentation Apple sur l’accélération des builds incrémentaux). Cette étape est essentielle : un projet peut afficher une compilation longue alors que le problème visible par le développeur est en réalité une attente de Runner.
| Symptôme observé | Preuve à recueillir | Décision provisoire |
|---|---|---|
| Le même commit recompilé exécute les mêmes tâches coûteuses | Résumé des temps Xcode, journal de compilation et comparaison de deux exécutions | Tester Tuist Xcode Cache |
| Le travail reste en attente avant de démarrer | Horodatage de mise en file, attribution et état du Runner | Vérifier le routage, puis envisager un nœud supplémentaire |
| Le cache est téléchargé mais la compilation reste longue | États local, distant et absent, plus durée de transfert | Contrôler les entrées du cache et le réseau |
| Les tests d’interface occupent l’essentiel du temps | Journaux Simulator, session graphique et durée des tests | Séparer le pool de tests du pool de compilation |
| L’archive échoue ou monopolise le nœud | Journaux d’archivage, certificats et profils utilisés | Réserver un environnement de publication contrôlé |
Ne confondez pas un « build froid » avec une compilation incrémentale. Le premier reconstruit une grande partie de l’environnement ; le second peut ne toucher qu’un sous-ensemble de cibles. Les dépendances résolues, les scripts personnalisés et les étapes de génération peuvent également rester lentes même lorsque des produits compilés sont réutilisés.
Premier contrôle : établir une ligne de base exploitable
Choisissez un commit représentatif et exécutez exactement le même périmètre sans changer simultanément la version de Xcode, l’architecture, les variables d’environnement ou la destination de test. Conservez au minimum :
- l’heure d’entrée dans la file ;
- l’heure d’attribution du Runner ;
- le début et la fin de la compilation ;
- le début et la fin des opérations de cache ;
- la durée des tests et de la signature ;
- l’heure à laquelle le résultat est réellement disponible.
Répétez la comparaison avec une compilation propre et une compilation répétée. Une seule exécution ne permet pas de conclure : elle peut subir un téléchargement exceptionnel, une saturation du réseau ou un Runner déjà occupé.
Attention : ne transformez pas une moyenne empirique en objectif universel. Tuist confirme le fonctionnement du cache, ses exigences d’environnement et ses états de résultat, mais aucune documentation fournie ici ne définit un taux de succès valable pour tous les projets.
SECTION 02Quand Tuist Xcode Cache devient le bon premier essai
Tuist Xcode Cache est pertinent lorsque votre pipeline reconstruit régulièrement des produits dont les entrées restent suffisamment identiques. Le cas typique est un projet où plusieurs branches ou plusieurs validations compilent les mêmes modules, avec une chaîne d’outils et une architecture cohérentes.
L’intérêt ne se limite pas au nombre de fichiers modifiés. Vous devez vérifier les paramètres qui participent à l’identité du produit : options de compilation, cible d’architecture, chemins d’environnement, dépendances, version de l’outil et configuration du projet. Une différence apparemment secondaire peut empêcher la réutilisation.
Les travaux suivants constituent de bons candidats :
- recompilation de modules partagés entre plusieurs validations ;
- dépendances internes qui changent rarement ;
- compilations répétées sur une même architecture ;
- étapes de construction exécutées plusieurs fois dans une journée ;
- projets dont les scripts ne réécrivent pas constamment les entrées de compilation.
À l’inverse, commencez par corriger le projet si chaque exécution produit des entrées différentes, si les chemins absolus varient entre machines, ou si les scripts génèrent des fichiers non déterministes. Dans ce cas, activer le cache peut ajouter du transfert et du diagnostic sans résoudre la cause.
Ce que vous devez vérifier dans l’activation
Le guide officiel de Tuist Xcode Cache décrit les prérequis, les réglages CI, l’authentification et les états de cache. Votre contrôle doit couvrir les points suivants :
- le cache est activé dans l’environnement réellement utilisé par la CI, et pas uniquement sur le poste local ;
- l’identité CI dispose des droits nécessaires pour lire et téléverser les produits ;
- le service distant est joignable depuis le Runner ;
- la stratégie de téléversement correspond à votre politique de coût et de durée ;
- les journaux indiquent clairement une réutilisation locale, une réutilisation distante ou une absence de correspondance ;
- la version de l’outil et celle de Xcode sont identiques entre les exécutions comparées.
Tuist documente également l’authentification destinée aux environnements d’intégration continue (instructions CI officielles de Tuist). Une connexion fonctionnelle ne suffit toutefois pas à prouver qu’un produit a été réutilisé : vous devez relier l’état du cache à la tâche de compilation concernée.
SECTION 03Pourquoi un cache actif peut-il laisser votre pipeline lent ?
Le premier conflit apparent est fréquent : les journaux montrent des correspondances de cache, mais le temps de livraison ne baisse presque pas. Cela ne signifie pas automatiquement que la fonctionnalité est défectueuse. Le gain de compilation peut être absorbé par le réseau, les tests ou l’attente d’un Runner.
Le transfert peut déplacer le goulot d’étranglement
Comparez la taille des produits transférés, leur durée d’envoi et leur durée de réception avec le temps de compilation réellement évité. La mise à jour Tuist du 8 septembre 2026 décrit une réutilisation par blocs destinée à réduire du travail de transfert dans certains cas (note de changement Tuist). Elle ne permet pas d’extrapoler un pourcentage de gain à chaque projet.
Si le Runner est éloigné du point de cache, ou si plusieurs tâches transfèrent simultanément de gros produits, le nouveau goulot peut être la liaison réseau. Vous devez alors examiner le chemin entre le nœud et le point de service, les erreurs de reprise, les phases d’attente et le volume réellement envoyé.
| Situation après activation | Lecture technique | Action et condition d’arrêt |
|---|---|---|
| Compilation plus courte, transfert négligeable | Le cache répond au problème principal | Conservez-le et surveillez les états sur plusieurs commits |
| Compilation plus courte, transfert presque équivalent | Le bénéfice CPU est absorbé par le réseau | Limitez les téléversements ou rapprochez le nœud du service |
| Peu de réutilisations, entrées instables | Le projet ou l’environnement varie trop | Arrêtez l’essai et corrigez la reproductibilité |
| Cache efficace, mais attente persistante | La capacité CI domine le temps total | Conservez le cache et augmentez le nombre de nœuds disponibles |
| Compilation correcte, tests ou signature dominants | Le travail non compilable est majoritaire | Isolez les pools de test et de publication |
Les tests de comparaison doivent donc enregistrer le temps utile, c’est-à-dire le moment où le résultat exploitable est disponible, et non uniquement la fin de la compilation.
Les paramètres de compilation peuvent annuler une correspondance
Un même code source n’implique pas un même produit. Comparez notamment :
- l’architecture demandée ;
- la destination de compilation ;
- les options de compilation ;
- les variables injectées par la CI ;
- les chemins de dépendances ;
- la version de Xcode et des outils de génération ;
- les fichiers produits par les scripts avant la compilation.
Si l’un de ces éléments varie entre votre poste et le Runner, traitez le faible taux de réutilisation comme un problème de reproductibilité jusqu’à preuve du contraire. Ne fixez pas arbitrairement un seuil de « bon » taux de cache : la valeur utile dépend de la proportion de compilation évitée, du coût du transfert et du reste du pipeline.
SECTION 04Quand la file d’attente impose-t-elle un Mac distant supplémentaire ?
Un cache ne crée pas une machine disponible. Il peut réduire certaines tâches une fois le travail lancé, mais il ne permet pas à un Runner déjà occupé d’accepter simultanément un autre travail incompatible.
Les règles des Runner auto-hébergés imposent de tenir compte des étiquettes, des groupes, de l’état en ligne et des critères de routage (documentation officielle sur les Runner auto-hébergés). Dans votre système, utilisez les journaux de la plateforme CI pour confirmer :
- le moment où le travail entre dans la file ;
- la raison pour laquelle aucun Runner ne lui est attribué ;
- les étiquettes ou contraintes qui excluent les nœuds disponibles ;
- la durée pendant laquelle un Runner reste occupé ;
- le nombre de travaux simultanés réellement acceptés.
Un scénario concret aide à éviter une mauvaise décision. Supposons que les validations de demandes de modification attendent un nœud, tandis qu’une compilation déjà lancée termine rapidement grâce au cache. Ajouter encore du cache ne raccourcira pas l’attente initiale. Vous devez d’abord corriger le routage ou fournir une capacité Mac supplémentaire.
À l’inverse, si les travaux démarrent immédiatement mais passent l’essentiel de leur temps à compiler les mêmes modules, acheter ou louer un nœud supplémentaire ne fera que multiplier une tâche inefficace. Activez alors le cache, puis mesurez à nouveau avant de modifier la capacité.
Deuxième contrôle : répartir les files par nature de travail
Séparez au moins les catégories opérationnelles suivantes dans votre analyse :
- validations fréquentes de code ;
- tâches planifiées et génération de rapports ;
- publication et archivage ;
- tests d’interface ou tests nécessitant une session graphique.
Cette séparation ne signifie pas obligatoirement quatre pools physiques. Elle vous permet de voir si une tâche de publication longue bloque les validations courtes, ou si un test graphique monopolise un environnement qui pourrait compiler d’autres branches.
SECTION 05Pourquoi les tests d’interface et la signature résistent-ils au cache ?
Tuist Cache peut aider une étape de compilation, mais il ne remplace pas l’exécution réelle de l’application. Les tests d’interface doivent encore démarrer et piloter un Simulator ou un appareil compatible ; Apple distingue explicitement l’exécution sur appareils simulés et physiques dans sa documentation (guide Apple sur le Simulator et les appareils).
Les limites à examiner sont différentes :
- une session graphique peut être déjà occupée ;
- le runtime du Simulator peut manquer ou être incompatible ;
- les tests peuvent dépendre de l’état persistant d’une session ;
- l’archivage peut utiliser des réglages distincts de ceux de la compilation ;
- la signature nécessite des certificats, profils et secrets disponibles dans le bon contexte.
Les problèmes d’archive et de signature doivent être traités avec les contrôles propres à cette étape, notamment ceux décrits dans la note technique Apple sur les erreurs d’archivage. Si l’archive échoue après une compilation réussie, ce n’est pas une preuve que le cache est inutile.
Construire des pools selon les contraintes
Un pool de compilation peut privilégier la reproductibilité et la vitesse de lancement. Un pool de tests doit garantir l’accès au Simulator, une session graphique stable et des runtimes appropriés. Un pool de publication doit protéger les secrets et maintenir une chaîne de signature vérifiable.
Les avantages d’une séparation sont clairs :
- une tâche de publication ne bloque pas automatiquement les validations ;
- les nœuds de test peuvent être dimensionnés selon la durée graphique ;
- les contraintes de sécurité sont visibles au lieu d’être mélangées aux performances ;
- l’échec d’une signature ne brouille pas le diagnostic de compilation.
La contrepartie est une capacité moins interchangeable. Si vous segmentez trop tôt, vous pouvez créer plusieurs petites files d’attente. Mesurez donc l’occupation réelle et prévoyez un routage de secours avant de figer les pools.
Expérience de terrain : lorsque la compilation s’améliore mais que la livraison reste lente, inspectez d’abord l’étape qui retarde la disponibilité du résultat. Le dernier processus exécuté n’est pas forcément celui qui consomme le plus de temps total.
SECTION 06La méthode de décision en six étapes
Première étape : choisir un commit témoin
Prenez un commit qui représente une validation ordinaire, avec les mêmes dépendances, la même architecture, le même périmètre de tests et les mêmes réglages Xcode. Notez la version de chaque outil utilisé par le Runner.
Deuxième étape : mesurer sans modifier le pipeline
Enregistrez séparément attente, préparation, compilation, cache, tests, archivage, signature et remise du résultat. Ne comparez pas une exécution locale interactive à une exécution CI sans signaler cette différence.
Troisième étape : activer le cache sur une voie contrôlée
Conservez une voie de référence sans cache et une voie d’essai avec cache. Utilisez le même commit lorsque cela est possible. Vérifiez dans les journaux si la correspondance est locale, distante ou absente.
Quatrième étape : examiner les entrées
Si les correspondances sont irrégulières, comparez l’architecture, les paramètres, les chemins, les variables, les scripts et les versions d’outils. Arrêtez l’expérimentation si vous ne pouvez pas expliquer les variations.
Cinquième étape : isoler la capacité
Mesurez la file d’attente indépendamment du temps d’exécution. Si les travaux attendent un Runner alors que la compilation est déjà raisonnable, testez un nœud supplémentaire ou un routage par pool. Pour une capacité temporaire, vous pouvez étudier les options de location de Mac de MACNOX après avoir défini les contraintes d’architecture, d’accès et de sécurité.
Sixième étape : fixer une sortie et un retour arrière
Votre décision doit préciser quand conserver le cache, quand limiter les téléversements, quand augmenter la capacité et quand revenir à la voie de référence. Sans condition d’arrêt, un essai de cache peut rester indéfiniment actif malgré un transfert coûteux ou une reproductibilité insuffisante.
SECTION 07La checklist avant de choisir cache, extension ou double piste
- [ ] Ai-je séparé le temps d’attente du temps d’exécution du Runner ?
- [ ] Ai-je distingué compilation froide, compilation incrémentale, scripts et résolution des dépendances ?
- [ ] Ai-je comparé le même commit avec la même architecture et les mêmes paramètres ?
- [ ] Les journaux prouvent-ils une réutilisation locale, distante ou aucune réutilisation ?
- [ ] Ai-je mesuré séparément téléversement, téléchargement et compilation évitée ?
- [ ] Ai-je vérifié les identifiants CI et les droits de lecture ou d’écriture du cache ?
- [ ] Les tests d’interface, l’archivage et la signature sont-ils comptés à part ?
- [ ] Une tâche longue bloque-t-elle les validations sur le même nœud ?
- [ ] Ai-je une voie de référence sans cache pour revenir en arrière ?
- [ ] Ai-je défini la condition qui fera arrêter l’essai ou commander un nœud supplémentaire ?
Si les quatre premières réponses sont négatives, ne concluez pas encore sur la valeur de Tuist Xcode Cache. Si l’attente reste longue malgré une compilation améliorée, passez à l’analyse de capacité Mac CI. Si le cache et la file d’attente sont tous deux responsables, la double piste est plus cohérente qu’un choix exclusif.
SECTION 08La décision finale dépend du problème dominant
| Preuve dominante | Choix recommandé | Ce qu’il faut arrêter ou réévaluer |
|---|---|---|
| Recompilation répétée, file courte, entrées stables | Priorité à Tuist Xcode Cache | Arrêter si les transferts annulent durablement la compilation évitée |
| File d’attente longue, Runner indisponible, exécution stable | Ajouter ou mieux router des Mac distants | Réévaluer si le nouveau nœud reste sous-utilisé |
| Cache utile et file d’attente persistante | Double piste : cache plus capacité | Réduire l’extension si la file disparaît sans gain supplémentaire |
| Entrées instables et faible réutilisation | Corriger la reproductibilité avant d’optimiser | Suspendre l’essai tant que la cause n’est pas expliquée |
| Tests d’interface ou signature dominants | Séparer les pools de test et de publication | Ne pas attribuer leur durée au cache de compilation |
| Réseau dominant après activation | Limiter les transferts ou rapprocher les nœuds | Revenir à la voie de référence si le coût dépasse le gain |
Pour un projet stable, bien paramétré et souvent recompilé, le cache est généralement le premier essai le moins perturbateur. Pour une équipe bloquée par le manque de nœuds disponibles, l’extension de capacité répond plus directement au problème. Lorsque les validations compilent beaucoup mais attendent aussi un Runner, conservez le cache et ajoutez une capacité séparée plutôt que de demander à une seule optimisation de résoudre deux causes différentes.
SECTION 09Foire aux questions
Quels builds Xcode peuvent réellement bénéficier de Tuist Xcode Cache ?
Le cache vise surtout les produits de compilation réutilisables lorsque le même code, les mêmes dépendances, l’architecture et les paramètres restent compatibles. Il aide donc davantage les compilations répétées que les scripts, les tests d’interface, l’archivage ou la signature. Vous devez vérifier l’état des tâches et comparer un même commit dans un environnement propre avant de conclure.
Un cache peu souvent utilisé mérite-t-il encore d’être conservé ?
Oui, mais seulement si les réutilisations évitent une part importante de compilation et que leur transfert ne consomme pas le gain. Une fréquence faible peut venir d’entrées instables, d’architectures différentes ou d’un environnement mal aligné. Mesurez séparément compilation, téléchargement et téléversement, puis fixez une condition d’arrêt plutôt que d’appliquer un seuil universel.
Faut-il activer le cache Xcode ou ajouter un Runner ?
Activez d’abord le cache lorsque les mêmes cibles sont recompilées et que les tâches attendent peu. Ajoutez ou séparez des Runner lorsque la file d’attente, les sessions graphiques, le Simulator ou la signature dominent la durée totale. Si ces deux symptômes apparaissent ensemble, conservez le cache et augmentez la capacité Mac sur une double piste contrôlée.
Comment distinguer une file d’attente Mac CI d’une compilation trop lente ?
Chronométrez séparément l’attente avant attribution, le démarrage du Runner, la compilation, le transfert du cache, les tests et la livraison du résultat. Une file longue avec un temps d’exécution stable indique un problème de capacité ou de routage. Une exécution longue après attribution pointe plutôt vers le projet, le cache, le réseau ou les tâches de test.
Tuist Cache accélère-t-il les tests d’interface et la signature ?
Pas directement. Le cache peut réutiliser certains produits compilés, mais un test d’interface doit encore lancer une session Simulator ou un appareil compatible. L’archivage et la signature doivent également s’exécuter avec les certificats, profils et réglages attendus. Traitez donc compilation, tests et publication comme des étapes distinctes dans votre pipeline.
Si votre environnement actuel repose sur un seul Mac partagé, vous cumulez souvent trois limites : une file d’attente difficile à prévoir, des tâches graphiques qui bloquent les compilations et une signature qui impose de conserver un nœud particulier disponible. Une machine locale supplémentaire règle parfois le manque de capacité, mais elle ne fournit pas nécessairement un accès continu, une séparation claire des pools ou une mise à disposition rapide pour un essai. Pour valider une capacité temporaire sans acheter immédiatement du matériel, vous pouvez comparer ces contraintes avec un environnement Mac distant de MACNOX, puis conserver uniquement la configuration qui répond aux mesures de votre pipeline.
Lorsque le besoin devient régulier et fortement chargé, l’achat d’un Mac dédié peut rester plus cohérent, surtout si vous devez contrôler physiquement les périphériques, les secrets ou le réseau. En revanche, pour une montée en charge ponctuelle, une migration de CI ou une comparaison entre deux configurations, la location d’un Mac distant évite de transformer une hypothèse d’architecture en investissement permanent. Après votre test, consultez la page de commande Mac de MACNOX seulement si la capacité supplémentaire, l’accès root et la disponibilité continue correspondent aux contraintes que vous avez réellement mesurées.