PlattformRunner-Maschinen

Runner-Maschinen

Windows-, macOS- und self-hosted-Jobs auf Maschinen, die Sie registrieren.

Manche Jobs können nicht im Cluster laufen. Ein Windows-Container braucht den NT-Kernel und existiert auf einem Linux-Host überhaupt nicht, und macOS lässt sich nicht containerisieren — für windows-latest und macos-latest gibt es also nirgends einen Pod. Sie registrieren die Maschine, und die Plattform erreicht sie per SSH.

app.equantic.space/einstellungen/runner-maschinen
windows-latestmacos-latest
win-runner-1windows/amd64runner@10.0.0.42Nimmt Jobs an
mac-mini-1macos/arm64runner@10.0.0.51Nimmt Jobs an
build-boxlinux/amd64runner@10.0.0.7Wird entleert
mac-studiomacos/arm64runner@10.0.0.52nicht erreichbar
1Die Labels, die der Job fordert
2Sitzung öffnen und fragen
3Der zu installierende Public Key
Jede Maschine zeigt, was die Plattform tatsächlich über sie weiß: die Labels, auf die sie hört, und ob sie je erreicht wurde.

Wann Sie eine brauchen

runs-onWo es läuft
ubuntu-latest, ein Container-ImageIm Cluster. Nichts zu registrieren.
windows-latestAuf einer registrierten Windows-Maschine.
macos-latestAuf einem registrierten Mac. Apples Lizenz verlangt Apple-Hardware.
self-hostedAuf einer registrierten Maschine mit beliebigem Betriebssystem — genau das bedeutet das Label.

Ein Job, dessen Labels zu keiner Maschine passen, scheitert sofort, statt am falschen Ort zu laufen, und seine Annotation nennt, was fehlt: keine Maschine für dieses OS, eine Maschine im Draining oder ein Label, das keine hat. Der Run scheitert, statt Erfolg für Arbeit zu melden, die nie gebaut wurde.

Eine Maschine registrieren

Gehen Sie zu Einstellungen → Plattform → Runner-Maschinen und klicken Sie auf Maschine registrieren. Sie geben an, was die Maschine ist: Adresse, das Konto, unter dem die CI läuft, Betriebssystem, Architektur und wie viele Jobs sie gleichzeitig annimmt.

Nach einem Private Key werden Sie nie gefragt. Die Plattform erzeugt ein ed25519-Paar, verschlüsselt die private Hälfte im Ruhezustand mit derselben Chiffre wie die Secrets und zeigt Ihnen nur die öffentliche.

Das ist Absicht. Einen Private Key in ein Formular zu kleben heißt, die gefährlichste Zeichenkette, die Sie besitzen, durch eine Seite, einen Request und vermutlich die Zwischenablage zu schicken — und der Key, zu dem die meisten greifen, ist ihr eigener Login-Key, der weit mehr erlaubt als CI auszuführen.

Den Key installieren

Der Bildschirm liefert den Befehl für das Betriebssystem genau dieser Maschine, denn das Ziel unterscheidet sich wirklich.

Unter Linux und macOS die übliche Stelle:

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

Unter Windows nicht diese Stelle. Für jedes Konto in der Gruppe Administrators liest OpenSSH eine maschinenweite Datei und ignoriert ~/.ssh/authorized_keys vollständig:

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"
Unter Windows gelingt die Installation im Home-Verzeichnis, ändert aber nichts, und die nächste Verbindung wird mit Permission denied (publickey) abgewiesen — ein Fehler, der nach falschem Key aussieht. Achten Sie außerdem darauf, dass die Datei mit einem Zeilenumbruch endet: ein Key, der an eine nicht abgeschlossene letzte Zeile angehängt wird, verschmilzt beide zu einem ungültigen Eintrag, und danach authentifiziert sich gar nichts mehr.

Die Verbindung testen

Testen öffnet eine Sitzung und fragt die Maschine, was sie ist. Ein Roundtrip beantwortet drei Fragen: SSH funktioniert, eine POSIX-Shell ist vorhanden, und welche Maschine das wirklich ist.

Eine unter dem falschen Betriebssystem registrierte Maschine besteht den Test nicht und sagt warum. Das ist kein Verbindungsproblem und schlimmer als eines: das Routing schickte windows-latest-Jobs auf eine Linux-Kiste, und jeder scheiterte an einem Befehl, den es dort nicht gibt — ohne dass irgendetwas auf die Registrierung zurückwiese.

Schlägt ein Test fehl, bekommen Sie den Grund im Wortlaut — ssh: connect to host 10.0.0.42 port 22: Operation timed out — statt eines allgemeinen Fehlers. Eine nie erreichte Maschine sagt genau das, und das ist etwas anderes als unerreichbar.

Was die Maschine braucht

  • Einen SSH-Server und ein Konto ohne Privilegien, unter dem die CI läuft.
  • Eine POSIX-Shell. Unter Windows ist das Git for Windows, dessen bash.exe als DefaultShell von OpenSSH gesetzt ist — jeder Step läuft darüber.
  • git und tar, die Git for Windows bereits mitbringt.

Sonst nichts. Die Node-Runtime, die JavaScript-Actions brauchen, legt die Plattform selbst ab — gebaut für Betriebssystem und Architektur genau dieser Maschine — beim ersten Job, der dort läuft.

Entleeren und entfernen

Entleeren beendet die laufenden Jobs und nimmt keine neuen an: der Zustand für einen Neustart oder ein Update der Maschine. Entfernen lässt die Plattform sie vergessen.

Entfernen rührt die Maschine nicht an. Ihre authorized_keys trägt den Public Key der Plattform weiter, bis Sie ihn dort herausnehmen.

Die Isolation ist schwächer als ein Container

Das sei deutlich gesagt. Ein Job auf einer registrierten Maschine sieht, was der vorige Job außerhalb seines Workspace hinterlassen hat: das Home-Verzeichnis, /tmp, installierte Pakete, den Zustand jedes Daemons. Ein Container gibt jedes Mal ein frisches Root, das hier nicht.

Was abgemildert ist: das Konto hat keine Privilegien, der Workspace gehört einem einzelnen Job, und das Aufräumen verweigert jeden Pfad außerhalb des Arbeitsverzeichnisses. Nutzen Sie eine registrierte Maschine für Arbeit, die Sie auch auf einer geteilten Build-Box unbesorgt laufen ließen.