Le premier Mac n’est créé qu’après l’arrivée du travail dans la file, puis le job attend encore l’environnement Xcode et l’enregistrement du Runner.
La décision la plus rapide est la suivante : testez Runner Scale Set Client uniquement si vous savez déjà créer, initialiser, récupérer et journaliser vos Mac. Il fournit un contrôle d’extension et une configuration JIT, mais ne crée pas à votre place une flotte macOS prête à compiler. Si cette chaîne n’existe pas encore, conservez un pool fixe et mettez en place un fonctionnement mixte avec quelques nœuds préchauffés et une extension manuelle.
Cet article s’adresse aux ingénieurs DevOps qui maintiennent plusieurs Mac Runner et veulent adapter leur capacité à la file GitHub Actions. Il vise aussi les équipes mobiles qui doivent isoler la signature, ainsi que les responsables CI qui comparent nœuds fixes, pool préchauffé et nœuds créés pour une seule tâche.
Point de contrôle avant le pilote — Ne mesurez pas uniquement la durée totale du workflow. Séparez l’attente en file, la livraison du Mac, la préparation Xcode et l’enregistrement du Runner afin de savoir où se trouve réellement le retard.
Dernière mise à jour : 6 septembre 2026. Les éléments GitHub ont été vérifiés dans la documentation officielle, le dépôt actions/scaleset et la documentation de l’API REST à cette date.
Le périmètre réel de Runner Scale Set Client
Le nom peut donner l’impression qu’il s’agit d’un service complet de mise à l’échelle. Ce n’est pas le cas. Le client orchestre les signaux du Scale Set et la génération de la configuration JIT ; votre plateforme reste responsable du Mac physique ou distant, du système installé et de son cycle de vie. Le dépôt officiel Runner Scale Set Client le présente encore comme une solution en Public Preview au 6 septembre 2026.
La séparation des responsabilités doit être écrite avant toute expérimentation :
- GitHub Actions fournit la demande de travail et les informations liées au Scale Set ;
- Runner Scale Set Client aide à obtenir une configuration JIT et à coordonner l’arrivée du Runner ;
- votre système doit sélectionner ou créer le Mac ;
- vos scripts doivent installer ou vérifier Xcode, les simulateurs, les dépendances et les caches ;
- votre mécanisme de fin de tâche doit supprimer l’inscription, exporter les journaux et détruire ou remettre à zéro le nœud.
L’API REST officielle documente la génération d’une configuration JIT pour un Runner auto-hébergé. Elle ne transforme toutefois pas cette réponse en Mac opérationnel. Consultez la documentation officielle de l’API des Runners auto-hébergés avant d’implémenter les appels d’authentification.
Premier jalon : prouver l’approvisionnement
Pour un premier test, exigez un journal comportant chaque transition : demande reçue, nœud attribué, système accessible, outils validés, Runner enregistré, tâche terminée, inscription supprimée et nœud récupéré. Un résultat « Runner en ligne » ne prouve pas que votre solution sait fournir un poste exploitable.
Si la création du Mac dépend encore d’une intervention humaine, ne présentez pas le système comme une extension automatique. Classez-le comme un pool fixe avec allocation manuelle. Cette formulation est moins spectaculaire, mais elle protège votre estimation de capacité et vos engagements de livraison.
Le cycle de vie face à l’isolement
La comparaison importante ne porte pas seulement sur la vitesse d’inscription. Elle concerne ce qui reste après un travail : fichiers temporaires, dépendances téléchargées, journaux contenant des variables, trousseaux, certificats et caches associés au projet.
Un Runner permanent conserve généralement son espace de travail et ses outils entre les jobs. Il réduit la préparation, mais la dérive de l’environnement devient difficile à détecter. Un Mac temporaire créé pour une tâche limite la réutilisation involontaire, à condition que sa destruction soit réellement vérifiée. Un nœud préchauffé occupe une position intermédiaire : il est disponible rapidement, mais doit être réinitialisé selon une procédure stricte entre deux travaux.
La documentation GitHub sur les Runners auto-hébergés temporaires recommande de traiter les Runners à usage unique comme des objets dont la configuration et la fin de vie doivent être contrôlées. La configuration JIT doit rester confidentielle entre son émission, son utilisation et sa suppression. Ne la placez donc pas dans une sortie de commande, un artefact de build ou un ticket d’incident.
Pour décider, appliquez cette règle :
- utilisez un pool permanent pour les builds internes peu sensibles lorsque la stabilité des outils prime ;
- utilisez un pool préchauffé pour les builds ordinaires lorsque le temps de préparation est le principal frein ;
- utilisez un nœud temporaire dédié pour la signature, la publication et les workflows provenant de sources moins fiables ;
- séparez toujours les labels, les credentials et les règles d’accès entre ces groupes.
Les pull requests non fiables et les dépôts publics ne doivent pas partager un nœud capable de signer une application. Le fait qu’un Runner accepte un job démontre une capacité d’exécution, pas une validation de sécurité. Les recommandations GitHub pour sécuriser l’utilisation des Actions doivent guider la séparation des pools.
La chronologie du démarrage et de la file
Une extension peut réduire les machines inutilisées tout en dégradant l’expérience des premiers jobs. Pour le vérifier, construisez une chronologie par étapes, plutôt qu’un seul indicateur de durée :
- T0 — demande : le workflow entre dans la file et attend un label compatible ;
- T1 — attribution : votre orchestrateur sélectionne un Mac ou demande sa création ;
- T2 — préparation : le système démarre, vérifie l’accès distant et prépare l’environnement ;
- T3 — initialisation : Xcode, les simulateurs, les dépendances et les certificats autorisés sont contrôlés ;
- T4 — enregistrement : le Runner reçoit sa configuration JIT et devient disponible ;
- T5 — exécution : le build, les tests ou la tâche de publication commencent ;
- T6 — récupération : les journaux sont transférés, l’inscription est supprimée et le nœud est détruit ou nettoyé.
Cette chronologie sert à comparer trois politiques sans inventer de seuil universel. Le mode entièrement JIT minimise les ressources conservées, mais ajoute les étapes T1 à T4 au premier job. Un pool préchauffé maintient quelques machines prêtes et réserve la création à la demande excédentaire. Un pool fixe privilégie la prévisibilité, mais laisse votre équipe gérer la capacité et la dérive.
Mesurez ces événements sur des exécutions comparables, puis consignez la file, la préparation et la récupération séparément. Les chiffres de capacité et de délai doivent venir de vos propres enregistrements ; aucune durée générale ne peut être déduite du seul fonctionnement de Runner Scale Set Client.
La reproductibilité des environnements Xcode
Un nœud qui s’enregistre correctement peut encore être inutilisable pour un projet iOS ou macOS. La véritable validation commence avec un build réel sur un Mac vierge, pas avec la présence du processus Runner.
Organisez trois essais :
- une première compilation sur un nœud neuf, sans supposer l’existence d’un cache ;
- une deuxième compilation avec la stratégie de cache prévue en production ;
- une reconstruction complète après destruction du nœud, pour vérifier que le résultat ne dépend pas d’un état caché.
Comparez la version Xcode, les SDK, les simulateurs, les gestionnaires de dépendances, les clés de cache et les réglages de signature. En cas d’échec, enregistrez l’état de l’environnement avant de corriger le projet. Cette démarche est différente d’un simple diagnostic de xcodebuild : l’objectif est de prouver qu’un poste éphémère peut redevenir fonctionnel de façon répétable.
Runner Scale Set Client ne fabrique pas votre image macOS et ne restaure pas automatiquement une session graphique. Les projets qui utilisent des simulateurs, des outils audio ou vidéo, des extensions de design ou des étapes nécessitant une interface doivent donc documenter séparément la disponibilité de cette session. Une connexion SSH active ne garantit pas qu’un outil graphique se comportera comme sur un Mac local.
Si vous exploitez déjà un environnement Mac distant pour les builds Xcode, utilisez-le comme base de comparaison, mais ne réutilisez pas aveuglément son état disque. Le test doit démontrer la reconstruction, non la simple survie d’un poste ancien.
Les choix d’authentification et de journalisation
Votre pilote doit choisir un mode d’authentification avant de choisir une politique d’extension. Une GitHub App et un jeton personnel n’ont pas le même périmètre, la même responsabilité de rotation ni le même rayon d’impact en cas de fuite. Comparez les permissions demandées au niveau organisation, dépôt et Runner, puis documentez qui renouvelle le secret et qui intervient lorsqu’il est révoqué.
La documentation GitHub sur les configurations JIT doit rester la référence pour les paramètres et la réponse de l’API. Dans les scripts et les exemples internes, utilisez uniquement des variables telles que <ORGANISATION>, <DEPOT>, <APP_ID>, <JETON> et <NOM_NOEUD>. Ne consignez jamais leur valeur réelle.
Les journaux du Runner doivent survivre au nœud lorsque l’objectif est de diagnostiquer une panne après destruction. Exportez-les vers un emplacement externe avant la suppression, en masquant les variables sensibles. Vérifiez ensuite un scénario d’échec volontaire : le job échoue, le nœud disparaît, mais l’équipe peut encore retrouver le numéro du workflow, l’étape fautive, l’identifiant du nœud et le motif de récupération.
Expérience à ne pas confondre avec une preuve de production — Un job qui réussit sur un Runner fraîchement inscrit prouve seulement que le chemin nominal fonctionne. Ajoutez un échec, une interruption réseau et une suppression prématurée pour tester la récupération réelle.
Foire aux questions opérationnelles
Runner Scale Set Client et Mac auto-hébergé
Runner Scale Set Client peut participer à une solution incluant macOS, mais cette compatibilité ne fournit ni matériel, ni image, ni Xcode. Votre équipe doit connecter le client à un mécanisme capable de rendre un Mac accessible, de préparer ses outils, puis de le récupérer après la tâche. Le dépôt officiel restant en Public Preview, contrôlez régulièrement son état avant d’engager une architecture critique.
Extension selon la file GitHub Actions
L’extension utile commence par une corrélation entre la file et les nœuds réellement livrés. Lorsque la demande augmente, votre contrôleur doit obtenir un Mac compatible, attendre sa validation, appliquer la configuration JIT et exposer le Runner au workflow. Si l’une de ces étapes reste manuelle, conservez l’étiquette de pool fixe et mesurez séparément l’intervention humaine.
Nœud temporaire ou Runner permanent
Le choix dépend de la sensibilité du travail et de votre capacité de reconstruction. Le Runner permanent convient aux builds internes répétitifs, mais son espace peut contenir des résidus. Le nœud temporaire convient mieux à la signature, aux publications et aux travaux nécessitant une séparation stricte. Le pool préchauffé est un compromis, à condition de vérifier sa remise à zéro.
Architecture sans Kubernetes
Kubernetes n’est pas une condition logique pour exploiter un Scale Set avec des Mac. Une plateforme d’automatisation différente peut fournir le même rôle si elle sait suivre l’état du nœud, gérer les erreurs et déclencher la récupération. En revanche, l’absence de Kubernetes ne supprime pas le besoin d’un orchestrateur fiable. Sans celui-ci, choisissez un pool fixe plutôt qu’une extension déclarée mais non vérifiable.
Cache Xcode et signature avec JIT Runner
JIT Runner limite la durée d’inscription, mais ne décide pas où conserver les caches ni comment protéger les certificats. Réduisez la dépendance au cache pour le premier build, restaurez uniquement des données validées et installez les secrets juste avant l’étape autorisée. Après le job, supprimez les éléments temporaires et détruisez le nœud lorsque la politique de signature l’exige.
La grille de décision pour le pilote
Utilisez le tableau ci-dessous après avoir collecté vos journaux de livraison, de file et de récupération. Il ne remplace pas une mesure réelle : il relie chaque stratégie à la condition qui doit être démontrée.
| Stratégie | Approvisionnement requis | Isolation | Effet sur le premier job | Décision adaptée |
|---|---|---|---|---|
| Pool fixe | Création manuelle ou réservation stable | Faible à moyenne selon le nettoyage | Prévisible si le nœud est disponible | Tâches stables, faible variation de charge |
| Pool préchauffé | Mise à disposition contrôlée et réinitialisation | Moyenne à forte | Plus court que la création complète | Charge variable, automatisation encore incomplète |
| Nœud temporaire JIT | Création, initialisation, enregistrement et destruction automatisés | Forte si la récupération est prouvée | Dépend de T1 à T4 | Signature, publication et isolation stricte |
Adoptez un pilote ciblé si vous pouvez livrer les Mac sans action humaine, reconstruire Xcode et transférer les journaux hors du nœud. Commencez par des builds non liés à la publication, puis ajoutez un workflow de signature isolé après validation.
Choisissez le double fonctionnement si la file varie mais que l’approvisionnement ou la récupération échoue encore dans certains cas. Gardez des Mac préchauffés pour les tâches prioritaires et utilisez l’extension à la demande uniquement comme capacité complémentaire. Cette stratégie évite de faire dépendre tous les builds d’un mécanisme encore instable.
Reportez l’extension si vos tâches sont régulières, si le nombre de nœuds reste réduit ou si vous ne pouvez pas expliquer un échec après destruction du Mac. Dans ce cas, améliorez d’abord le pool fixe, la journalisation et la reconstruction de l’environnement.
Le coût total plutôt que le seul temps de calcul
Le calcul économique doit inclure le cycle complet : période de location des nœuds, maintien du pool préchauffé, préparation Xcode, reconstruction après échec, stockage des journaux et temps d’exploitation. Un nœud à la demande n’est pas automatiquement moins cher si chaque incident exige une intervention manuelle.
Pour une estimation honnête, associez chaque workflow à son historique réel :
- durée d’attente dans la file ;
- temps de livraison et de préparation du Mac ;
- taux de reconstruction après échec ;
- part de capacité préchauffée restée inutilisée ;
- volume de journaux conservés ;
- temps d’un ingénieur consacré aux incidents et aux rotations de secrets.
Si vous devez disposer rapidement de Mac isolables sans acheter de matériel, vous pouvez comparer un cycle de location Mac adapté à votre équipe avec votre coût de possession interne. La comparaison doit inclure la gestion des remplacements et de la disponibilité, pas seulement le prix affiché. Pour un essai, réservez une capacité indépendante et ne mélangez pas les nœuds de validation avec ceux d’une publication réelle.
Le calendrier de mise en œuvre
Semaine de cadrage — définissez les labels, les types de workflows, les règles de signature et les événements à journaliser. Décidez aussi quels jobs peuvent utiliser un Runner permanent et lesquels doivent exiger un nœud temporaire.
Jalon d’approvisionnement — créez un Mac de test avec des valeurs fictives pour l’organisation, le dépôt, l’App ID, le jeton et le nom de nœud. Prouvez son accès, son initialisation et sa suppression sans utiliser de secret de production.
Jalon de reproductibilité — exécutez les trois essais sur nœud neuf, avec cache, puis après reconstruction. Conservez les versions d’outils et les résultats dans un rapport externe au Mac.
Jalon de sécurité — testez une tâche interrompue, un workflow non fiable et une suppression anticipée. Vérifiez que les secrets ne figurent ni dans les logs, ni dans les artefacts, ni dans le poste suivant.
Décision d’exploitation — choisissez pilote, double fonctionnement ou report uniquement après comparaison des journaux de file, de livraison, de préparation, d’exécution et de récupération. Réévaluez la décision si le dépôt passe de Public Preview à une autre phase ou si l’API et les règles de cycle de vie changent.
Un Mac loué peut accélérer ce pilote, mais il ne remplace pas votre ingénierie de cycle de vie. Une solution fixe achetée ou réservée en permanence vous donne davantage de contrôle sur le matériel, mais vous impose l’immobilisation, la maintenance, le nettoyage et la capacité de remplacement. À l’inverse, un pool distant géré par VMSPIN peut fournir des nœuds réels accessibles à la demande, avec un coût et une période d’utilisation que vous pouvez limiter au test. Pour votre premier essai Runner Scale Set Client, privilégiez donc des Mac indépendamment reconstructibles, puis élargissez le pool seulement lorsque la récupération, les journaux et l’isolation sont démontrés.