Bereitstellung & Anmeldung
Prüfen Sie Bestellung und Zugangsdaten, stellen Sie die erste SSH-Verbindung her und hinterlegen Sie Ihren öffentlichen Schlüssel.
Erste Verbindung einrichtenPrüfen Sie zuerst die Verbindung, legen Sie dann die Toolchain fest und binden Sie anschließend CI an. Dieser Leitfaden folgt der Reihenfolge in der Praxis und zeigt, wie Sie einen dedizierten physischen Mac als zuverlässigen Build-Runner einrichten. Keine VM: Sie können macOS sowohl über die grafische Oberfläche als auch über die Kommandozeile nutzen.
Sie haben bereits einen Host? Beginnen Sie unten mit „Bereitstellung und Anmeldung“. Sie möchten erst die passende Konfiguration finden? Testen Sie zunächst einen einzelnen Build und legen Sie danach die gewünschte Parallelität fest.
Prüfen Sie Bestellung und Zugangsdaten, stellen Sie die erste SSH-Verbindung her und hinterlegen Sie Ihren öffentlichen Schlüssel.
Erste Verbindung einrichtenSkripte und CI nutzen SSH. Für Xcode, Simulatoren und die grafische Oberfläche verwenden Sie die Bildschirmfreigabe per VNC.
Verbindung einrichtenRegistrieren Sie einen selbstverwalteten Runner, verwenden Sie getrennte Toolchain-Tags und starten Sie mit einem Build pro Host.
Runner einrichtenPrüfen Sie Abrechnungszeitraum, Zusatzoptionen und Laufzeit. Für Bestellung, Zahlung und Verlängerungsstatus sind die Angaben im Portal maßgeblich.
Abrechnung ansehenKeine passenden Themen gefunden. Suchen Sie nach „Verbindung“, „Zertifikat“ oder „Abrechnung“ oder löschen Sie die Suche, um alle Schritte anzuzeigen. Bei Fragen zu einem bestimmten Host melden Sie sich im Portal an und erstellen Sie ein Support-Ticket.
Die folgende Reihenfolge ist eine Empfehlung und keine Zusage für Bereitstellungs- oder Bearbeitungszeiten. Prüfen Sie im Portal zuerst, ob der Dienst bereitgestellt wurde. Verwenden Sie anschließend die für diese Instanz angezeigte Adresse, den Port und den Benutzernamen. Zugangsdaten für den Host dürfen nicht aus Beispielen abgeleitet werden.
Melden Sie sich im Portal an und prüfen Sie in den Details des jeweiligen Dienstes Modell, Standort und Mietdauer. Notieren Sie die Host-ID: Sie benötigen sie später für die Fehlersuche, Verlängerung und Support-Tickets. Verbindungsadresse und initiale Zugangsdaten sind nur im autorisierten Konto einsehbar.
Übernehmen Sie die im Portal angezeigten Angaben in Ihre lokale Verbindungskonfiguration. Prüfen Sie bei der ersten Verbindung den Fingerabdruck des Host-Schlüssels. Wenn Sie keine vertrauenswürdige Quelle dafür haben, klären Sie ihn zuerst per Support-Ticket, statt die Prüfung zu überspringen. Nach erfolgreicher Anmeldung können Sie System und Benutzer überprüfen.
Führen Sie in einer interaktiven SSH-Sitzung passwd aus und ändern Sie das Passwort des aktuellen Benutzers wie angegeben. Passwörter gehören weder in Befehlsargumente noch in Repositories, Chatverläufe oder Build-Logs. Lassen Sie die aktuelle Sitzung geöffnet und prüfen Sie die neuen Zugangsdaten in einer zweiten Sitzung.
Erstellen Sie auf Ihrem eigenen Computer einen dedizierten Schlüssel und hinterlegen Sie nur den öffentlichen Schlüssel auf dem Host. Ändern Sie die Passwortanmeldung erst, wenn die Anmeldung per Schlüssel funktioniert. Lassen Sie vor Änderungen an der SSH-Konfiguration eine funktionierende Sitzung geöffnet, damit Sie sich nicht aussperren.
ssh -p "$MAC_SSH_PORT" "$MAC_USER@$MAC_HOST"
whoami
sw_vers
uname -m
xcode-select -p
df -h
passwd
Legen Sie vor dem Verbinden lokal MAC_SSH_PORT, MAC_USER und MAC_HOST fest. Die Werte finden Sie im Portal. Die übrigen Befehle führen Sie nach der Anmeldung auf dem Host aus. Mit xcode-select -p prüfen Sie den Pfad der aktuell ausgewählten Entwicklertools.
install -d -m 700 "$HOME/.ssh"
touch "$HOME/.ssh/authorized_keys"
chmod 600 "$HOME/.ssh/authorized_keys"
printf '%s\n' "$LOGIN_PUBLIC_KEY" >> "$HOME/.ssh/authorized_keys"
Setzen Sie zuerst LOGIN_PUBLIC_KEY auf den vollständigen Text Ihres öffentlichen Schlüssels und führen Sie dann den Befehl zum Hinzufügen aus. Laden Sie niemals Ihren privaten Schlüssel hoch und fügen Sie denselben öffentlichen Schlüssel nicht mehrfach hinzu. Eine Zeitüberschreitung, eine fehlgeschlagene Authentifizierung und ein geänderter Host-Schlüssel sind unterschiedliche Probleme. Beschreiben Sie im Support-Ticket genau, welches davon vorliegt.
Notieren Sie zuerst die benötigten Xcode-, SDK- und Runtime-Versionen Ihres Projekts, statt direkt auf die neueste Version zu aktualisieren. Welche Versionen installiert werden können, hängt von der Kompatibilität zwischen Betriebssystem und Xcode ab. Verwenden Sie bei bestehenden Projekten zunächst die lokal erfolgreich getestete Kombination und prüfen Sie ein Upgrade separat.
Falls xcodes auf dem Host noch nicht installiert ist, richten Sie das Tool nach dem von Ihrem Team freigegebenen Softwareprozess ein. Verwenden Sie für die Installation einer bestimmten Version ein rechtmäßig bezogenes lokales Xcode-Installationspaket, das den Projektanforderungen entspricht. XCODE_VERSION und XCODE_XIP stehen im folgenden Beispiel für die geprüfte Versionsnummer und den absoluten Pfad zum Installationspaket. Interaktive Installationsschritte gehören nicht in unbeaufsichtigte Build-Jobs.
xcodes installed
xcodes install "$XCODE_VERSION" --path "$XCODE_XIP"
xcodes installed
export DEVELOPER_DIR="$XCODE_APP/Contents/Developer"
xcodebuild -version
xcodebuild -showsdks
xcrun simctl list runtimes
XCODE_APP muss auf den tatsächlichen Pfad der installierten App zeigen. Setzen Sie für CI bevorzugt DEVELOPER_DIR in der Job-Umgebung, damit mehrere Jobs nicht um die systemweite Auswahl konkurrieren. Wenn Sie die systemweite Standard-Toolchain ändern müssen, führen Sie sudo xcode-select --switch "$XCODE_APP/Contents/Developer" aus und prüfen Sie anschließend erneut xcodebuild -version.
Starten Sie die ausgewählte Xcode-Version zum ersten Mal und schließen Sie die erforderliche Komponenteneinrichtung ab. Die grafische Oberfläche erreichen Sie über eine Fernverbindung. Installieren Sie anschließend in den Komponenteneinstellungen von Xcode die benötigte Runtime. Führen Sie xcrun simctl list devices available aus und wählen Sie einen Simulator, der zum Testziel passt. Starten Sie ihn zunächst einmal interaktiv und warten Sie, bis er vollständig hochgefahren ist, bevor Sie einen kleinen Testjob ausführen. Das Archivieren für ein echtes Gerät und das Ausführen von Simulator-Tests sind getrennte Schritte. Eine fehlende Runtime ist kein Fehler der Archivierungs-Toolchain.
Geben Sie die Toolchain-Prüfung am Anfang des CI-Logs aus: mindestens die Xcode-Version, die SDK-Liste und den Commit-Hash. Erstellen Sie nach einem Xcode-Wechsel neue Cache-Schlüssel und prüfen Sie Drittanbieter-Abhängigkeiten, Signierung und Export. Nur das Runner-Tag zu ändern, ohne den tatsächlich verwendeten Toolpfad zu prüfen, garantiert keine einheitliche Build-Umgebung.
Jobs auf demselben physischen Host teilen sich CPU, Arbeitsspeicher, Festplatte und Benutzerumgebung. Starten Sie mit einem Build-Job pro Host. Sobald Archivierung, Signierung und Bereinigung zuverlässig funktionieren, können Sie die Parallelität anhand der tatsächlichen Spitzenauslastung erhöhen oder einen separaten Host hinzufügen.
Erstellen Sie in den Runner-Einstellungen des Projekts einen Projekt-Runner, richten Sie das zugehörige Authentifizierungs-Token ein und vergeben Sie die drei Tags macos, arm64 und ios-archive. Hinterlegen Sie die Instanzadresse und das Authentifizierungs-Token vorübergehend in GITLAB_URL und GITLAB_RUNNER_TOKEN. Registrieren Sie unter einem dedizierten Build-Benutzer einen Shell-Executor. Entfernen Sie anschließend die temporäre Token-Variable.
gitlab-runner register \
--non-interactive \
--url "$GITLAB_URL" \
--token "$GITLAB_RUNNER_TOKEN" \
--executor "shell" \
--description "armrdp-ios-archive"
unset GITLAB_RUNNER_TOKEN
gitlab-runner verify
Setzen Sie in der vom Runner verwendeten config.toml den globalen Wert concurrent = 1 und für den betreffenden Runner limit = 1. Starten Sie den Runner entsprechend der Dienstverwaltung Ihrer installierten Version. Eine erfolgreiche interaktive Prüfung bedeutet nicht, dass der Hintergrunddienst bereits läuft.
ios_archive:
tags:
- macos
- arm64
- ios-archive
script:
- xcodebuild -version
- xcodebuild archive -workspace "$IOS_WORKSPACE" -scheme "$IOS_SCHEME" -destination 'generic/platform=iOS' -archivePath "$CI_PROJECT_DIR/output/App.xcarchive"
artifacts:
paths:
- output/App.xcarchive
expire_in: 7 days
Hinterlegen Sie die tatsächlichen Werte für IOS_WORKSPACE und IOS_SCHEME in den Projektvariablen und richten Sie zuerst die Signierung wie im nächsten Abschnitt beschrieben ein. Dieses Beispiel erstellt nur ein Archiv; Export und Upload sind nicht enthalten. Die Aufbewahrung der Build-Artefakte für 7 Tage ist ein Beispiel und kann an die Richtlinien Ihres Teams angepasst werden. Zertifikate, private Schlüssel und temporäre Keychains gehören nicht in Artefakte.
Laden Sie über die Installationsanweisungen des Repositorys die passende Runner-Anwendung für macOS ARM64 herunter und wechseln Sie in das entpackte Verzeichnis. Setzen Sie REPOSITORY_URL auf die Adresse des aktuellen Repositorys und RUNNER_TOKEN auf das Token für diese Registrierung. Die Tags müssen sowohl in der Runner-Konfiguration als auch im Workflow vorkommen, damit Jobs der richtigen Toolchain zugewiesen werden.
./config.sh \
--url "$REPOSITORY_URL" \
--token "$RUNNER_TOKEN" \
--name "armrdp-ios-archive" \
--labels "macos,arm64,ios-archive" \
--work "_work"
unset RUNNER_TOKEN
./run.sh
name: iOS archive
on:
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ios-archive
cancel-in-progress: false
jobs:
archive:
runs-on: [self-hosted, macos, arm64, ios-archive]
env:
DEVELOPER_DIR: ${{ vars.DEVELOPER_DIR }}
IOS_WORKSPACE: ${{ vars.IOS_WORKSPACE }}
IOS_SCHEME: ${{ vars.IOS_SCHEME }}
steps:
- uses: actions/checkout@v4
- name: Archive
run: |
xcodebuild -version
xcodebuild archive \
-workspace "$IOS_WORKSPACE" \
-scheme "$IOS_SCHEME" \
-destination 'generic/platform=iOS' \
-archivePath "$RUNNER_TEMP/App.xcarchive"
Hinterlegen Sie zuerst Toolpfad, Workspace und Scheme als Repository-Variablen. Das Beispiel wird manuell gestartet, damit Sie die Umgebung zunächst prüfen können. Stellen Sie Runner mit Signaturzugangsdaten nicht für nicht vertrauenswürdigen externen Code bereit. Ein Runner-Prozess führt jeweils einen Job aus; concurrency begrenzt zusätzlich die Ausführung von Workflows derselben Gruppe, aber nicht die Ressourcennutzung des Hosts.
Nach erfolgreicher Prüfung konfigurieren Sie den dauerhaften Betrieb anhand des mitgelieferten Dienstskripts und stellen Sie sicher, dass der Dienst unter demselben Benutzer läuft, mit dem Sie manuell getestet haben. Wenn Sie die Signierung für einen Benutzer einrichten, der Dienst aber unter einem anderen läuft, ist ein häufiges Ergebnis, dass interaktive Builds funktionieren, CI jedoch Zertifikat oder Bereitstellungsprofil nicht findet.
Distributionszertifikat, zugehöriger privater Schlüssel und Bereitstellungsprofil müssen zum verwendeten Team und zur Bundle-ID des Projekts passen. Prüfen Sie die Signierung zuerst in einem kontrollierten Job und binden Sie sie erst danach in einen unbeaufsichtigten Ablauf ein. Deaktivieren Sie Signaturprüfungen nicht, um Exportfehler zu umgehen.
Verwenden Sie für automatisierte Jobs eine separate Build-Keychain. Das Passwort wird über eine geschützte CI-Geheimvariable bereitgestellt. Erlauben Sie nach dem Import des Zertifikats nur den tatsächlich benötigten Signierungstools den Zugriff. Gewähren Sie nicht allen Apps Zugriff auf den privaten Schlüssel. Die folgenden Prüfungen zeigen, ob der aktuelle Benutzer eine gültige Signierungsidentität sieht. Sie bestätigen nicht, dass Bereitstellungsprofil, Exportoptionen und Projekteinstellungen vollständig übereinstimmen.
security list-keychains -d user
security find-identity -v -p codesigning
printf '%s\n' "$HOME/Library/MobileDevice/Provisioning Profiles"
printf '%s\n' "$HOME/Library/Developer/Xcode/UserData/Provisioning Profiles"
Der Speicherort von Bereitstellungsprofilen kann je nach Xcode-Version variieren. Maßgeblich ist der Pfad, den die verwendete Toolchain tatsächlich ausliest. Prüfen Sie nach dem Import Gültigkeitsdauer, App-ID und Signierungstyp. Wenn die Archivierung funktioniert, der Export aber fehlschlägt, gleichen Sie die Exportmethode, Team-ID und Zuordnung der Bereitstellungsprofile ab, statt Xcode wiederholt neu zu installieren.
Wenn Ihr Team fastlane match bereits nutzt, halten Sie sich an das vorhandene verschlüsselte Zertifikats-Repository und die Zugriffsrichtlinien. Verwenden Sie zur Prüfung bundle exec fastlane match appstore --readonly, um zunächst vorhandenes Signierungsmaterial zu laden und unbeabsichtigte Änderungen an Teamzertifikaten durch den Build-Host zu vermeiden. Zugangsdaten für das Repository, Entschlüsselungspasswort und Keychain-Passwort müssen getrennt verwaltet werden. Produktive Signierungsvariablen dürfen nur geschützten Branches oder kontrollierten manuellen Jobs zur Verfügung stehen.
Entfernen Sie nach einem Job temporäre Dateien und sperren Sie die temporäre Keychain. Protokollieren Sie nur notwendige Fehlercodes und Ergebnisse der einzelnen Schritte. Private Schlüssel, Zertifikatspasswörter, Registrierungstoken und vollständige Geheimvariablen dürfen nicht im Log erscheinen. Ein dedizierter physischer Mac bietet Ressourcentrennung; die Berechtigungen für Zugangsdaten im Projekt sollten dennoch nach dem Prinzip der geringsten Rechte vergeben werden.
Sie können eine +1TB-SSD oder eine +2TB-SSD hinzubuchen. Prüfen Sie zuerst in der Bestellung und auf dem Host, ob die Erweiterung abgeschlossen ist, und planen Sie dann die Migration. Volume-Name, Einhängepunkt und Dateisystem richten sich nach den tatsächlich bereitgestellten Angaben. Übernehmen Sie nicht einfach die Datenträgerkennung eines anderen Hosts.
Führen Sie diskutil list und df -h aus, um Kapazität und Einhängepunkte zu prüfen. Löschen oder partitionieren Sie keine unbekannten Datenträger. Erstellen Sie für den Build-Benutzer ein Cache-Verzeichnis mit Schreibberechtigung und testen Sie Lese- und Schreibzugriff mit einer kleinen Datei. Nachdem Sie das Verhalten beim Neustart geprüft haben, können Sie den dauerhaft laufenden Runner auf den neuen Pfad umstellen.
Stoppen Sie vor der Migration die Annahme neuer Jobs und warten Sie, bis laufende Archivierungs- und Signierungsjobs abgeschlossen sind. DerivedData ist ein wiederherstellbarer Cache. Erstellen Sie den Cache vorzugsweise am neuen Speicherort neu, statt einen möglicherweise gerade beschriebenen alten Cache zu kopieren. Mit -derivedDataPath legen Sie den Pfad gezielt fest; das gesamte Benutzerverzeichnis muss nicht auf das zusätzliche Volume verschoben werden.
diskutil list
df -h
test -d "$BUILD_VOLUME" && test -w "$BUILD_VOLUME"
mkdir -p "$BUILD_VOLUME/DerivedData/$CACHE_KEY"
xcodebuild archive \
-workspace "$IOS_WORKSPACE" \
-scheme "$IOS_SCHEME" \
-destination 'generic/platform=iOS' \
-derivedDataPath "$BUILD_VOLUME/DerivedData/$CACHE_KEY" \
-archivePath "$BUILD_VOLUME/Archives/$BUILD_ID/App.xcarchive"
Setzen Sie BUILD_VOLUME vor dem Ausführen auf ein geprüftes, beschreibbares Einhängeverzeichnis. CACHE_KEY sollte Repository, Xcode-Version und Build-Konfiguration unterscheiden. Verwenden Sie für BUILD_ID eine eindeutige Kennung des aktuellen Jobs, damit sich verschiedene Jobs nicht gegenseitig überschreiben. Jobs, die parallel laufen, dürfen nicht dasselbe beschreibbare DerivedData-Verzeichnis verwenden.
Führen Sie zunächst einen Build ohne Cache aus und beobachten Sie anschließend Cache-Treffer und Speicherverbrauch. Legen Sie getrennte Aufbewahrungsregeln für Archive, Simulator-Daten und Abhängigkeits-Caches fest. Vergewissern Sie sich vor dem Löschen, dass kein Job die Daten noch verwendet. Build-Artefakte sollten zusätzlich in einem vom Team verwalteten Artefaktspeicher gesichert werden. Der Cache auf dem Host ist kein Ersatz für ein Backup. Exportieren Sie vor Ende der Mietdauer Ihre Daten und prüfen Sie, ob das Backup lesbar ist.
Bei Fragen zu Host, Bestellung oder Zahlung melden Sie sich im Portal an und erstellen Sie ein Support-Ticket. So lässt sich Ihr konkreter Dienst zuordnen. Falls Sie sich nicht anmelden können, schreiben Sie eine E-Mail an support@armrdp.com. Das sind die beiden offiziellen Kontaktwege.
| Angabe | Empfohlene Informationen | Zweck |
|---|---|---|
| Host- oder Bestellnummer | Die zugehörige Nummer aus dem Portal und der aktuelle Standort | Den richtigen Dienst finden und Verwechslungen vermeiden |
| Zeitpunkt | Start- und Endzeit, Zeitzone und ob das Problem noch besteht | Dienstprotokolle und Job-Logs zeitlich zuordnen |
| Problemtyp | Zeitüberschreitung bei der Verbindung, Authentifizierungsfehler, Build- oder Signierungsfehler oder Abrechnungsstatus | Netzwerk-, Toolchain- und Abrechnungsprobleme unterscheiden |
| Schritte zur Reproduktion | Reihenfolge, kleinster erforderlicher Befehl, erwartetes und tatsächliches Ergebnis | Weniger Rückfragen und Kontextwechsel |
| Umgebung und Logs | Xcode-Version, Benutzer des Runner-Dienstes und bereinigte Logs vor und nach dem Fehler | Versions- und Berechtigungsprobleme erkennen |
| Auswirkungen | Einzelner Job oder gesamter Host betroffen? Gibt es einen alternativen Build-Weg? | Umfang und aktuelle Maßnahmen einschätzen |
Bearbeitungsstand und Antwortzeiten eines Tickets entnehmen Sie den tatsächlichen Einträgen im Portal. Eine erste Antwort ist nicht gleichbedeutend mit der Behebung des Problems. Bei Verbindungsproblemen müssen möglicherweise Host-Status und Zugriffsweg geprüft werden. Für Build-Probleme sind meist Job-Logs und Reproduktionsschritte nötig. Bei Zahlungsfragen muss die Transaktion der Bestellung zugeordnet werden. Diese Fälle lassen sich nicht mit einer einheitlichen festen Lösungszeit abdecken.
Ergänzen Sie während der Bearbeitung neue Nachweise im selben Ticket und geben Sie an, wie lange Sie bereits warten und ob sich die Auswirkungen vergrößert haben. Vermeiden Sie Neuinstallationen, das Löschen von Datenträgern oder umfangreiche Bereinigungen, die den aktuellen Zustand verändern könnten. Tritt ein Fehler nur in CI auf, halten Sie die Unterschiede zwischen interaktiver Ausführung und Dienstbetrieb unter demselben Benutzer fest. Bei Signierungsproblemen teilen Sie nur bereinigte Fehlermeldungen.
Der Dienst wird im Voraus für Tag, Woche, Monat oder Quartal bezahlt. Prüfen Sie bei einer Bestellung Modell, Standort, Anfang und Ende des Zeitraums sowie Zusatzoptionen. Für Verlängerungen, die automatische Verlängerung und den Zahlungsstatus sind die aktuellen Einstellungen und Rückmeldungen im Portal maßgeblich. Eine eingereichte Zahlung bedeutet nicht automatisch, dass die Bestellung bereits aktiviert wurde. Beurteilen Sie den Dienststatus nicht allein anhand eines Screenshots der Zahlungsseite.
Unterstützt werden ausschließlich USDT-TRC20 sowie Visa / Mastercard / Amex (über Stripe). Alle Beträge werden in US-Dollar abgerechnet; maßgeblich ist das vom Backend zurückgemeldete verfügbare Zahlungsgateway. Prüfen Sie bei einer Zahlung auf der Blockchain Netzwerk, Empfängerdaten und Betrag. Für eine Prüfung benötigen wir die Bestellnummer und die Transaktions-ID, niemals Ihren Wallet-Schlüssel oder vollständige Kartendaten.
Stoppen Sie vor Ablauf neue Builds, exportieren Sie Codeänderungen, Build-Artefakte und notwendige Konfigurationen und prüfen Sie in Ihrem eigenen Speicher, ob sie wiederhergestellt werden können. Wenn Sie den Dienst weiter nutzen möchten, prüfen Sie nach der Verlängerung das neue Ablaufdatum. Wenn Sie die Miete beenden, sollten Sie den Host nach Ablauf nicht als dauerhaften Speicherplatz einplanen.
Beginnen Sie mit einem Host und einem Job. Prüfen Sie Toolchain, Signierung und Build-Artefakte, bevor Sie auf mehrere Runner erweitern. Dedizierte physische Macs können tageweise gemietet werden, ab $21.1/Tag. Die aktuelle Verfügbarkeit sehen Sie im Portal.