PlateformeMachines de runner

Machines de runner

Les jobs Windows, macOS et self-hosted, sur des machines que vous enregistrez.

Certains jobs ne peuvent pas tourner sur le cluster. Un conteneur Windows a besoin du noyau NT et n'existe pas sur un hôte Linux, et macOS ne se conteneurise pas — pour windows-latest et macos-latest, il n'y a donc de pod nulle part. Vous enregistrez la machine, et la plateforme l'atteint en SSH.

app.equantic.space/config/machines-runner
windows-latestmacos-latest
win-runner-1windows/amd64runner@10.0.0.42Accepte des jobs
mac-mini-1macos/arm64runner@10.0.0.51Accepte des jobs
build-boxlinux/amd64runner@10.0.0.7Drainage
mac-studiomacos/arm64runner@10.0.0.52injoignable
1Les labels demandés par le job
2Ouvre la session et demande
3La clé publique à installer
Chaque machine affiche ce que la plateforme sait réellement d'elle : les labels auxquels elle répond, et si elle a déjà été jointe.

Quand vous en avez besoin

runs-onOù ça tourne
ubuntu-latest, une image de conteneurSur le cluster. Rien à enregistrer.
windows-latestSur une machine Windows enregistrée.
macos-latestSur un Mac enregistré. La licence Apple impose du matériel Apple.
self-hostedSur une machine enregistrée, quel que soit l'OS — c'est ce que le label veut dire.

Un job dont les labels ne correspondent à aucune machine échoue aussitôt plutôt que de tourner au mauvais endroit, et son annotation dit ce qui manque : aucune machine pour cet OS, une machine en cours de drainage ou un label qu'aucune n'a. Le run échoue au lieu d'annoncer un succès pour un travail jamais construit.

Enregistrer une machine

Allez dans Paramètres → Plateforme → Machines de runner et cliquez sur Enregistrer une machine. Vous déclarez ce qu'est la machine : adresse, le compte sous lequel la CI tournera, l'OS, l'architecture et le nombre de jobs qu'elle accepte à la fois.

À aucun moment on ne vous demande de clé privée. La plateforme génère une paire ed25519, chiffre la moitié privée au repos avec le même chiffrement que les secrets, et ne vous montre que la publique.

C'est délibéré. Coller une clé privée dans un formulaire, c'est faire passer la chaîne la plus dangereuse que vous possédez par une page, une requête et sans doute le presse-papiers — et la clé que la plupart des gens prennent est leur propre clé de connexion, qui donne bien plus que de quoi faire tourner la CI.

Installer la clé

L'écran vous donne la commande correspondant à l'OS de cette machine, car la destination diffère réellement.

Sous Linux et macOS, l'endroit habituel :

bash
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo 'ssh-ed25519 AAAA… eqs-mac-mini-1' >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Sous Windows, ce n'est pas cet endroit. Pour tout compte du groupe Administrators, OpenSSH lit un fichier commun à la machine et ignore totalement ~/.ssh/authorized_keys :

powershell
Add-Content -Path "$env:ProgramData\ssh\administrators_authorized_keys" -Value 'ssh-ed25519 AAAA… eqs-win-runner-1'
icacls "$env:ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
Sous Windows, l'installer dans le dossier personnel réussit, ne change rien, et la connexion suivante est refusée avec Permission denied (publickey) — une panne qui ressemble à une mauvaise clé. Vérifiez aussi que le fichier se termine par un saut de ligne : une clé ajoutée à une dernière ligne non terminée colle les deux en une entrée invalide, et plus rien ne s'authentifie.

Tester la connexion

Tester ouvre une session et demande à la machine ce qu'elle est. Un aller-retour répond à trois questions : SSH fonctionne, un shell POSIX est présent, et quelle machine c'est vraiment.

Une machine enregistrée sous le mauvais OS échoue au test et le dit. Ce n'est pas un problème de connexion, et c'est pire : le routage enverrait les jobs windows-latest vers une machine Linux, et chacun échouerait sur une commande absente, sans que rien ne renvoie à l'enregistrement.

Quand un test échoue, vous recevez la raison telle quelle — ssh: connect to host 10.0.0.42 port 22: Operation timed out — plutôt qu'une erreur générique. Une machine jamais jointe le dit, ce qui n'est pas la même chose qu'injoignable.

Ce qu'il faut sur la machine

  • Un serveur SSH et un compte non privilégié pour faire tourner la CI.
  • Un shell POSIX. Sous Windows, c'est Git for Windows, avec son bash.exe défini comme DefaultShell d'OpenSSH — chaque step y passe.
  • git et tar, que Git for Windows fournit déjà.

Rien d'autre. Le runtime Node dont les actions JavaScript ont besoin est déposé par la plateforme — compilé pour l'OS et l'architecture de cette machine — au premier job qui y tourne.

Drainer et retirer

Drainer termine les jobs en cours et n'en accepte plus : l'état à utiliser avant de redémarrer ou de mettre à jour une machine. Retirer fait que la plateforme l'oublie.

Retirer ne touche pas à la machine. Son authorized_keys garde la clé publique de la plateforme tant que vous ne l'enlevez pas.

L'isolation est plus faible qu'un conteneur

Autant le dire franchement. Un job sur une machine enregistrée voit ce que le job précédent a laissé hors de son workspace : le répertoire personnel, /tmp, les paquets installés, l'état de n'importe quel démon. Un conteneur donne une racine neuve à chaque fois, pas ceci.

Ce qui est atténué : le compte n'a pas de privilèges, le workspace est propre à chaque job, et le nettoyage refuse tout chemin hors de la racine de travail. Utilisez une machine enregistrée pour du travail que vous feriez tourner sereinement sur une build box partagée.