Erst verbinden, dann bauen

Vom ersten SSH-Befehl
bis zum ersten Archive

Für Entwickler, die gerade einen Knoten erhalten haben: Prüfen Sie zuerst Verbindung und Toolchain, bevor Sie die Build-Pipeline einrichten. Die Befehle hier sind Beispiele und zeigen nicht den Live-Status Ihres Knotens.

Wenn Sie bereits einen Knoten haben, beginnen Sie mit Schritt 1. Zugangsdaten, Ablaufdatum und Verfügbarkeit richten sich nach den aktuellen Angaben in der Konsole.

01 / Verbindung

Prüfen Sie zuerst, ob Sie mit Ihrem physischen Knoten verbunden sind

Öffnen Sie die entsprechende Instanz in der Konsole und prüfen Sie Knoten, IP-Adresse, SSH-Port und Benutzernamen. Übernehmen Sie keine Zugangsdaten aus alten Support-Tickets und speichern Sie Ihr Passwort nicht im Repository.

  1. 01

    Instanzdaten prüfen

    Öffnen Sie in der Konsole die Instanzdetails und notieren Sie IP-Adresse, Port und aktuelle Zugangsdaten. Im Folgenden stehen NODE_IPundSSH_PORT sowie NODE_USER für diese Werte. Weisen Sie sie vor der Ausführung im lokalen Terminal zu. Verwenden Sie die Variablennamen nicht unverändert als Adressen.

  2. 02

    Host-Fingerprint prüfen

    Beim ersten Verbindungsaufbau werden Sie gefragt, ob Sie dem Host vertrauen. Vergleichen Sie den angezeigten Fingerprint mit den Angaben aus einer vertrauenswürdigen Quelle, bevor Sie bestätigen. Können Sie ihn nicht prüfen, wenden Sie sich zuerst über ein Support-Ticket an uns. Umgehen Sie die Meldung nicht mit Optionen, die die Hostprüfung deaktivieren.

  3. 03

    Passwort ändern und Schlüssel einrichten

    Führen Sie nach dem ersten Login passwd aus, um das Passwort des aktuellen Benutzers zu ändern. Den öffentlichen Schlüssel können Sie auf den Knoten übertragen; der private Schlüssel bleibt immer lokal. Lassen Sie die bestehende Verbindung geöffnet und prüfen Sie in einem zweiten Terminal, ob der Login mit öffentlichem Schlüssel funktioniert. Passen Sie erst danach die Authentifizierungseinstellungen an.

Verbindungsdaten als Alias speichern

Fügen Sie lokal in ~/.ssh/config die folgende Konfiguration ein und ersetzen Sie die drei großgeschriebenen Felder durch die tatsächlichen Werte aus den Instanzdetails.IdentityFile muss auf eine lokal vorhandene private Schlüsseldatei verweisen. Wenn Sie noch keinen Schlüssel erstellt haben, führen Sie zuerst den rechts stehenden Befehl zur Schlüsselerzeugung aus.

Host armshell-dev
  HostName NODE_IP
  User NODE_USER
  Port SSH_PORT
  IdentityFile ~/.ssh/armshell_ed25519
  IdentitiesOnly yes
  ServerAliveInterval 30
  ServerAliveCountMax 3

Speichern Sie die Datei und verbinden Sie sich anschließend mit ssh armshell-dev . Wenn sich der Host-Fingerprint geändert hat, prüfen Sie zuerst, ob die Instanz neu bereitgestellt wurde. Löschen Sie den gespeicherten Eintrag nicht einfach, um sich danach erneut anzumelden.

Öffentlichen Schlüssel übertragen, nicht den privaten

Führen Sie den folgenden Befehl zum Eintragen des öffentlichen Schlüssels lokal aus. Der Alias muss bereits eingerichtet sein und die Anmeldung per Passwort muss funktionieren. Schützen Sie den Schlüssel mit einer Passphrase und bewahren Sie lokal eine sichere Sicherungskopie auf.

ssh-keygen -t ed25519 -f ~/.ssh/armshell_ed25519
cat ~/.ssh/armshell_ed25519.pub | ssh armshell-dev \
'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'
ssh -o PreferredAuthentications=publickey armshell-dev

Führen Sie nach dem Login whoami,sw_vers und df -haus, um Benutzer, Systemversion und verfügbaren Speicherplatz zu prüfen. Wenn die Berechtigungen nicht wie erwartet sind, beheben Sie das zuerst und installieren Sie erst danach die Entwicklertools.

02 / Toolchain

Erst interaktiv bauen, dann CI einrichten

Vergewissern Sie sich, dass die gewünschte Xcode-Version installiert ist und die Ersteinrichtung abgeschlossen wurde. Die folgenden Befehle und Ausgaben zeigen das Format. Versionen, SDKs und Zertifikatsnamen hängen von Ihrem Knoten und Projekt ab und sind keine Liste vorinstallierter Komponenten.

dev@armshell-tokyo
$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
$ xcode-select -p
/Applications/Xcode.app/Contents/Developer

$ sudo xcodebuild -runFirstLaunch
$ xcodebuild -showsdks
iOS SDKs:
    iOS 18.0                       -sdk iphoneos18.0
iOS Simulator SDKs:
    Simulator - iOS 18.0           -sdk iphonesimulator18.0

$ bundle exec fastlane match development --readonly
[09:12:01]: Successfully decrypted certificates repo
[09:12:03]: Installing certificate...
[09:12:05]: Installing provisioning profile...
[09:12:06]: All required keys, certificates and provisioning profiles are installed

$ xcodebuild -workspace App.xcworkspace -scheme App \
    -configuration Release -destination 'generic/platform=iOS' \
    -archivePath "$HOME/build/App.xcarchive" archive
** ARCHIVE SUCCEEDED **

Versionsauswahl gilt für den gesamten Knoten

xcode-select ändert das standardmäßige Entwicklerverzeichnis und wirkt sich auf andere Aufgaben auf demselben Rechner aus. Wenn Sie mehrere Versionen parallel verwenden, setzen Sie DEVELOPER_DIRvorzugsweise für den einzelnen Auftrag und geben Sie am Anfang des Logs xcodebuild -versionaus. So verhindern Sie, dass bei der Übergabe die falsche Toolchain verwendet wird.

Signierung muss in der aktuellen Sitzung möglich sein

Das Beispiel setzt voraus, dass das Projekt bereits für fastlane und Gemfile eingerichtet ist und Zugriff auf das Zertifikats-Repository besteht. Synchronisieren Sie vorhandene Zertifikate zunächst im Nur-Lese-Modus. Der Build-Benutzer muss auf seinen Schlüsselbund zugreifen und ihn entsperren können. Bei Signierungsfehlern prüfen Sie zuerst Berechtigungen und Provisioning-Profile, statt wiederholt neue Zertifikate zu erstellen.

Ein Archive ist noch keine fertige Veröffentlichung

Prüfen Sie zuerst den Namen des Arbeitsbereichs und des Schemes und kontrollieren Sie anschließend das Archive. Für den Export des Installationspakets benötigen Sie außerdem eine passende Exportkonfiguration. Notieren Sie nach dem ersten erfolgreichen Build Xcode-Version, Lockdatei der Abhängigkeiten und den vollständigen Befehl, bevor Sie den Build in die Pipeline übernehmen.

03 / Grafische Oberfläche

Öffnen Sie eine Desktop-Sitzung nur, wenn Sie die Oberfläche benötigen

Die Kommandozeile eignet sich für Übertragungen, Builds und Logprüfungen. Verwenden Sie die grafische macOS-Oberfläche, wenn Sie Tools erstmals einrichten, Schlüsselbundmeldungen prüfen oder Probleme mit der Benutzeroberfläche beheben müssen. Der Desktop-Zugang wird in den Instanzdetails nach dem Login angezeigt.

Zugriff aktivieren und Berechtigungen festlegen

Öffnen Sie das System über den für die Instanz bereitgestellten Desktop-Zugang und prüfen Sie unter „Systemeinstellungen → Allgemein → Teilen“ die „Bildschirmfreigabe“. Lassen Sie nur bestimmte Benutzer zu und aktivieren Sie nicht den Zugriff für alle. Falls sich Bildschirmfreigabe und Fernverwaltung gegenseitig ausschließen, prüfen Sie erst die aktuelle Konfiguration, statt beide Optionen gleichzeitig zu ändern.

Wenn Sie beim ersten Versuch keinen Desktop-Zugriff erhalten, bitten Sie über ein Support-Ticket in der Konsole um Prüfung. Ändern Sie nicht ohne ausreichende Kenntnisse in großem Umfang die Systemdienste für den Fernzugriff.

Support-Ticket in der Konsole öffnen

Client und Verbindungsweg

Unter macOS können Sie den integrierten Client „Bildschirmfreigabe“ verwenden. Auf anderen Systemen eignet sich ein Client, der das VNC-Protokoll und sichere Verbindungen unterstützt. Verwenden Sie nach Möglichkeit den sicheren Zugangsweg der Instanz und setzen Sie den Desktop-Dienst nicht direkt einem nicht vertrauenswürdigen Netzwerk aus.

Wenn Sie bestätigt haben, dass der VNC-Dienst des Knotens auf Port 5900 lauscht, können Sie über den folgenden SSH-Tunnel den Client mit 127.0.0.1:5901verbinden.

ssh -N -L 5901:127.0.0.1:5900 armshell-dev

Bildübertragung reduzieren

Beginnen Sie bei der ersten Verbindung möglichst mit einer Auflösung von 1440 × 900 und nur einem Bildschirm. Deaktivieren Sie unnötige Animationen. Bei begrenzter Bandbreite verringern Sie zuerst Bildqualität oder Bildrate. Eine höhere Auflösung beschleunigt den Build nicht, sondern erhöht nur das übertragene Datenvolumen.

Bandbreitenbedarf hängt von der Kodierung und den Bildänderungen ab; eine feste Bandbreitengarantie für alle Aufgaben gibt es nicht. Wenn die Verbindung ruckelt, pausieren Sie zunächst Uploads großer Dateien und prüfen Sie, ob SSH ebenfalls verzögert reagiert.

Desktop und Kommandozeile nutzen denselben dedizierten physischen Rechner.
04 / Continuous Integration

Lassen Sie den Runner die bereits geprüfte Umgebung nutzen

Registrieren Sie den Runner mit einem eigenen macOS-Build-Benutzer. Prüfen Sie zuerst mit einem parallelen Auftrag Abhängigkeiten, Signierung und Rückübertragung der Artefakte. Erhöhen Sie die Parallelität erst danach entsprechend der Speicher- und RAM-Auslastung. Weisen Sie einem Ausführungsdienst mit Zugang zu Veröffentlichungsdaten keine nicht vertrauenswürdigen Merge Requests zu.

GitLab: Shell Executor registrieren

Installieren Sie zuerst den für Apple Silicon geeigneten GitLab Runner. Der folgende Befehl setzt voraus, dass die ausführbare Datei im PATH des aktuellen Benutzers liegt und in der CI-Verwaltungsoberfläche bereits ein Runner mit Serveradresse und Authentifizierungstoken angelegt wurde.

read -r CI_SERVER_URL
read -rs RUNNER_TOKEN
gitlab-runner register --non-interactive \
  --url "$CI_SERVER_URL" \
  --token "$RUNNER_TOKEN" \
  --executor shell
unset RUNNER_TOKEN
gitlab-runner verify
gitlab-runner install
gitlab-runner start
gitlab-runner status

Legen Sie in der CI-Verwaltungsoberfläche eindeutige Tags fest, zum Beispiel macos-arm64 und die vom Projekt benötigte Xcode-Version. Die Tags des Auftrags müssen zum Runner passen. Führen Sie zuerst whoami,xcodebuild -versionaus und starten Sie anschließend den regulären Build.

GitHub Actions: selbst gehosteten Runner registrieren

Rufen Sie in den Runner-Einstellungen des Repositorys oder der Organisation das Installationspaket für macOS ARM64 und den aktuellen Registrierungsbefehl ab. Laden Sie das Paket herunter, prüfen Sie es und entpacken Sie es. Wechseln Sie dann in das entpackte Verzeichnis und führen Sie die folgenden Befehle aus. Beide Variablen erhalten Sie auf der Einstellungsseite.

read -r REPOSITORY_URL
read -rs RUNNER_TOKEN
./config.sh --url "$REPOSITORY_URL" \
  --token "$RUNNER_TOKEN" \
  --labels macos-arm64 --unattended
unset RUNNER_TOKEN
./svc.sh install
./svc.sh start
./svc.sh status

Verwenden Sie im Workflow runs-on: [self-hosted, macOS, ARM64]. Falls Sie eigene Tags verwenden, geben Sie diese ebenfalls an. Ein Registrierungstoken ist nicht dasselbe wie ein laufender Dienst. Prüfen Sie nach der Einrichtung den Dienststatus und führen Sie einen echten Testauftrag aus.

launchd-Dienst: installierten Dienst und geladene Einträge prüfen

Die oben gezeigten Installationsbefehle richten je nach Runner eine macOS-Dienstkonfiguration ein. Verwenden Sie bevorzugt die Verwaltungsbefehle des jeweiligen Runners und erstellen Sie nicht zusätzlich manuell einen zweiten Dienst für denselben Runner.

Ein benutzerbezogener LaunchAgent wird in der Regel beim Login des betreffenden Benutzers geladen. Wenn der Runner nach einem Neustart unbeaufsichtigt laufen soll, prüfen Sie zunächst die unterstützte Dienstkonfiguration, den Login-Status und die Schlüsselbundrichtlinien des Runners. „Aktuell online“ bedeutet nicht automatisch, dass der Dienst nach einem Neustart verfügbar ist.

ls "$HOME/Library/LaunchAgents"
launchctl print "gui/$(id -u)"
gitlab-runner status
./svc.sh status

Führen Sie die jeweils passenden Prüfungen im tatsächlichen Runner-Verzeichnis aus. In einer nicht interaktiven CI-Umgebung ist der PATH möglicherweise anders als im Terminal. Hinterlegen Sie die Pfade zu Homebrew, Ruby und Xcode in Build-Skripten unter Versionsverwaltung und geben Sie keine Tokens in Logs aus.

05 / Daten

Nur Änderungen synchronisieren und Backups außerhalb des Knotens aufbewahren

Klonen Sie Quellcode vorzugsweise aus dem Repository. Große Verzeichnisse, Build-Artefakte und Dateien, die nicht ins Repository gehören, lassen sich über rsync per SSH inkrementell synchronisieren. Ein gemieteter Knoten ist eine Arbeitsumgebung, kein Ersatz für eine unabhängige Datenkopie.

Erst Vorschau, dann übertragen

Prüfen Sie zunächst auf beiden Seiten rsync --version. Die folgenden Befehle verwenden gängige Grundoptionen: Ein Schrägstrich am Ende des Quellpfads bedeutet, dass der Inhalt des Verzeichnisses synchronisiert wird. Passen Sie Ausschlüsse an Ihr Projekt an. Lesen Sie zuerst die vollständige Vorschauausgabe und entfernen Sie erst danach -n.

rsync -avzn --exclude '.git/' --exclude 'build/' \
  ./project/ armshell-dev:~/work/project/

rsync -avz --exclude '.git/' --exclude 'build/' \
  ./project/ armshell-dev:~/work/project/

rsync -avz armshell-dev:~/build/ ./artifacts/

Fügen Sie nicht ohne vorherige Prüfung --deletehinzu. Damit werden zusätzliche Dateien am Ziel gelöscht. Verwalten Sie Zugriffsrechte für Schlüssel, Zertifikate und Logs mit sensiblen Daten separat. Verteilen Sie diese nicht öffentlich zusammen mit dem gesamten Arbeitsverzeichnis.

Parallele Knoten sind kein Internet-Turbo

Die parallele Verbindung über Thunderbolt 5 eignet sich für Szenarien, in denen mehrere Knoten große Dateien gemeinsam verarbeiten. Sie ersetzt nicht die Internetverbindung zwischen Ihrem lokalen Netzwerk und dem Knoten und beschleunigt nicht automatisch beliebige rsync-Aufgaben. Geben Sie vor der Bestellung die beteiligten Knoten, das Datenvolumen und den Workflow an, damit die passende Verbindung geprüft werden kann.

Wenn Sie mehr Arbeitsfläche benötigen, können Sie zusätzlich eine 1-TB- oder 2-TB-SSD buchen. Mehr Speicher ist kein Backup: Für Code, Artefakte und Zertifikate sollten weiterhin Kopien außerhalb des Knotens vorhanden sein.

Prüfen Sie nach jeder Veröffentlichung, ob die zurückübertragenen Dateien lesbar sind, und halten Sie für wichtige Artefakte Prüfsummen fest. Testen Sie vor Ablauf mindestens einmal eine unabhängige Wiederherstellung, statt sich nur auf die Erfolgsmeldung des Synchronisationsbefehls zu verlassen.

06 / Konto und Laufzeit

Ablaufdatum in die Checkliste vor dem Release aufnehmen

Prüfen Sie Bestellungen, Ablaufdaten der Instanzen, Rechnungen und Verlängerungen in der Konsole. Die Knoten laufen 365 Tage im Jahr. Ihre Mietlaufzeit und der Bestellstatus müssen Sie weiterhin anhand der Angaben in der Konsole verwalten.

Laufzeit und Zeitangaben prüfen

Der Dienst ist tageweise, wöchentlich, monatlich oder vierteljährlich verfügbar. Prüfen Sie Start- und Endzeit sowie die Zeitzone in der Konsole und planen Sie genügend Zeit für Builds, Rückübertragung und Backups ein. Warten Sie mit der Verlängerung nicht, bis ein langer Auftrag bereits läuft, und gehen Sie nicht davon aus, dass die Zahlung automatisch eingezogen wird.

Maßgeblich sind die Bestelldetails und das angezeigte Ablaufdatum.

Änderungen erst prüfen, dann umziehen

Prüfen Sie vor einem Modell-Upgrade, zusätzlichem Speicher oder einer Änderung der Laufzeit, welche Optionen, Preise und Umsetzungsarten für Ihre aktuelle Bestellung verfügbar sind. Gehen Sie nicht davon aus, dass jede Änderung sofort auf dem bestehenden Knoten umgesetzt wird. Sichern Sie bei einer Migration zuerst die Abhängigkeitsliste, die Signierungskonfiguration und Ihre Daten.

Unklare Umrechnungen oder Regelungen zum Inkrafttreten können Sie über ein Support-Ticket bestätigen lassen.

Zahlung und Gutschrift prüfen

Unterstützt werden ausschließlich USDT-TRC20 sowie Visa / Mastercard / Amex (über Stripe). Abgerechnet wird einheitlich in US-Dollar (USD); welche Zahlungswege tatsächlich verfügbar sind, richtet sich nach der Rückmeldung des Backends. Prüfen Sie bei einer Zahlung auf der Blockchain Netzwerk, Betrag und Empfängerdaten. Bestätigen Sie Kartenzahlungen auf der Rechnungsseite.

Wird der Status nicht aktualisiert, senden Sie Ihre Bestellnummer und den Transaktionsbeleg über ein Support-Ticket.
Bei Problemen schrittweise vorgehen

Erst Verbindung oder Auftrag als Ursache eingrenzen

Geben Sie bei einer Support-Anfrage Bestellnummer, Knoten, Zeitpunkt samt Zeitzone, ausgeführte Befehle und den vollständigen relevanten Fehlerabschnitt an. Screenshots oder bereinigte Terminalausgaben sind hilfreich. Senden Sie keine Passwörter, privaten Schlüssel, Tokens oder vollständigen Zahlungskartendaten.

SSH-Timeout: Wo fange ich mit der Fehlersuche an?
  1. Prüfen Sie in den Instanzdetails IP-Adresse, Port, Bestellung und Betriebsstatus, um eine veraltete Adresse auszuschließen.
  2. Führen Sie lokal ssh -vvv armshell-devaus, um zwischen Timeout, Verbindungsablehnung und fehlgeschlagener Authentifizierung zu unterscheiden. Das sind unterschiedliche Fehlerursachen.
  3. Prüfen Sie Ihr lokales Netzwerk und ausgehende Verbindungsregeln und testen Sie über ein anderes vertrauenswürdiges Netzwerk. Ein fehlgeschlagener ICMP-Test beweist für sich allein nicht, dass der SSH-Dienst nicht verfügbar ist.
  4. Wenn die Verbindung bei der Authentifizierung hängen bleibt, prüfen Sie Benutzernamen, Berechtigungen des privaten Schlüssels und Zuordnung des öffentlichen Schlüssels. Bei einem dauerhaften Timeout senden Sie bereinigte Logs über ein Support-Ticket, statt das Passwort immer wieder zurückzusetzen.
Xcode-Download oder Abruf von Abhängigkeiten langsam: Wie finde ich die Ursache?
  1. Prüfen Sie zuerst mit df -h den verfügbaren Speicherplatz. Es muss genug Platz für das Installationspaket, das Entpacken und den parallelen Speicher mehrerer Versionen vorhanden sein.
  2. Unterscheiden Sie zwischen der Übertragung des Xcode-Installationspakets, dem Abruf von Abhängigkeiten und dem ersten Build. Ein stockendes Build-Log bedeutet nicht zwangsläufig, dass gerade etwas heruntergeladen wird.
  3. Verwenden Sie vollständige Installationspakete aus vertrauenswürdigen Quellen und prüfen Sie deren Integrität. Vermeiden Sie es, große Dateiübertragungen gleichzeitig mit Backups auszuführen, damit sie nicht um Bandbreite konkurrieren.
  4. Notieren Sie Quelltyp, Dateigröße, Startzeit und Fehlermeldung. Senden Sie keine Download-Adresse mit Zugangstoken. Wenn die Netzwerkverbindung des Knotens geprüft werden muss, geben Sie diese Angaben in einem Support-Ticket an.
Remotedesktop verbunden, aber nur ein schwarzer Bildschirm?
  1. Prüfen Sie zuerst, ob SSH funktioniert, und grenzen Sie ein, ob der ganze Knoten nicht erreichbar ist oder nur die Desktop-Sitzung Probleme macht.
  2. Prüfen Sie, ob der Verbindungsbenutzer die Berechtigung für Bildschirmfreigabe hat und eine grafische Sitzung aktiv ist. Verringern Sie die Auflösung und verbinden Sie sich erneut.
  3. Wenn Sie einen SSH-Tunnel verwenden, prüfen Sie, ob das Terminal mit dem Tunnel noch läuft und der Client den lokalen Weiterleitungsport statt eines anderen Ports am Knoten verwendet.
  4. Starten Sie einen Knoten mit laufendem Build nicht einfach zwangsweise neu. Sichern Sie zunächst verfügbare Logs, beschreiben Sie, ob der Anmeldebildschirm sichtbar ist, und bitten Sie anschließend über ein Support-Ticket um Prüfung.
Runner getrennt oder online, nimmt aber keine Aufträge an?
  1. Prüfen Sie zuerst den Dienststatus und die Prozess-Logs, danach die CI-Verwaltungsoberfläche. Dass eine SSH-Verbindung zum Knoten möglich ist, bedeutet nicht, dass der Runner-Dienst läuft.
  2. Wenn der Runner online ist, aber keine Aufträge annimmt, prüfen Sie Projektberechtigungen, Runner-Tags, Workflow-Bedingungen und Einstellungen für geschützte Branches.
  3. Wenn die Verbindung nach einem Neustart abbricht, prüfen Sie die launchd-Ladedomäne und den Login-Status des Build-Benutzers. Ein manuell gestarteter Prozess im Terminal ersetzt keinen dauerhaft laufenden Dienst.
  4. Wenn ein Auftrag nach dem Start fehlschlägt, geben Sie Benutzer, PATH, Xcode-Version und Arbeitsverzeichnis aus und prüfen Sie Schlüsselbund- und Verzeichnisberechtigungen. Melden Sie den Runner nicht als ersten Schritt wiederholt ab und registrieren Sie ihn neu.

SSH funktioniert, aber das Problem besteht weiter?

Senden Sie uns den Fehler – mit allen wichtigen Angaben

Bei Fragen zur Auswahl und vor einer Bestellung können Sie uns per E-Mail kontaktieren. Bei technischen oder Abrechnungsfragen zu einer bestehenden Bestellung öffnen Sie bitte ein Support-Ticket in der Konsole, damit wir die Anfrage der Instanz und dem bisherigen Verlauf zuordnen können.