You already run Jenkins on Linux, aber iOS/macOS-Builds stecken zwischen dem Kauf von Hardware, der Warteschlange für gehostete Läufer oder der Betreuung von Laptops fest. Für Teams, die mitdenkenVPS operations, öffnet diese Anleitung einen vierten Weg: Behalten Sie den Controller unter Linux, schließen Sie ihn andedizierte Remote-Macs as SSH agents. Sie erhalten sieben Testlandminen, eine Vergleichstabelle dazuSelbstgehostete GitHub Actions-Läufer, a Onboarding-Runbook in sechs Schritten(Anmeldeinformationen, Labels, Parallelität,xcodebuild, Artefakte) und Querlinks zu unserenrunner, SSH checklist, and Fastlane + CI articles.
In vielen Unternehmen mangelt es nicht an Macs – es fehlt ihnen an einemüberprüfbar, skalierbar, Rollback-freundlichVertrag: Behalten Sie den Controller auf dem vertrauten Linux, verschieben Sie den macOS-Build-Fanout auf dedizierte Cloud-Macs. Die folgenden sieben Punkte verwandeln „Wir glauben an Jenkins“ in eine Risikotabelle, die Sie unterschreiben können.
Den Remote-Mac wie „Linux, das xcodebuild ausführt“ behandeln: Ignorieren von TCC, Schlüsselbund und gelegentlichen GUI-Abhängigkeiten lässt erste Signier- und Provisioning-Läufe scheitern.
Wiederverwendung eines persönlichen macOS-Kontos für CI:Schlafrichtlinien, Aktualisierungsaufforderungen und Desktop-Sitzungen unterbrechen echte unbeaufsichtigte Abläufe – erstellen Sie einen dedizierten CI-Benutzer und stimmen Sie ihn abreproducible builds.
Dimensionierung der Parallelität nur nach CPU-Kernen:Xcode-Speicherspitzen und NVMe-Schreibverstärkung wirken sich normalerweise vor der CPU aus; ohne EimerDerivedDatakönnen sich zwei Jobs gegenseitig blockieren.
SSH-Pfadunterschiede vom Controller zum Agent ignorieren:Bastionen, Schlüsselrotation undStrictHostKeyCheckingRichtlinien müssen in IaC verfügbar sein, sonst erhalten Sie am Rotationstag völlig rote Warteschlangen.
Zulassen, dass Plugins das Design ersetzen:Groovy und Ad-hoc-Shell auf Agenten verlängern die MTTR – definieren Sie einen minimalen Plugin-Satz und explizite Toolchain-Versionen.
Artefakte nur auf dem Agent belassen:Ohne Archivierung im Objektspeicher oder ein Artefakt-Repository leiden sowohl Festplatte als auch Compliance – binden Sie die Aufbewahrung an die Pipeline-Richtlinie.
Kein „First Human Window“-Plan:Bei der Erstinstallation des Signaturmaterials ist möglicherweise noch eine einmalige VNC- oder Desktop-Bestätigung erforderlich, bevor wieder auf Headless zurückgegriffen werden kann – sieheSSH vs. VNC-Checkliste.
Die häufigste Ursache besteht darin, dass „Remote-Mac“ als reine Rechenleistung und nicht als Rechenleistung behandelt wirdZustandsbehafteter Apple-Toolchain-Host. Plattformteams müssen Bild-Fingerabdrücke, Toolchain-Versionen, Schlüsselbundgrenzen und Bereinigungswasserzeichen auf die gleiche Weise verwalten wie Datenbankreplikate. Kombiniere es mitEnterprise Build-Pools: Wenn sich mehrere Apps einen Host teilen, müssen Jenkins-Beschriftungen feiner sein als „jeder Mac“, sonst kann die Warteschlangensemantik keine Isolation ausdrücken.
Gegenüber GitHub Actions lautet der eigentliche Unterschied nicht „Kann es kompilieren“, sondernEreignisquellen und Anmeldeinformationsgrenzen: Jenkins glänzt mit Cross-Repo-Orchestrierung und Cron-ähnlichen Jobs; Actions glänzt bei PR-nativen Arbeitsabläufen. Wenn Sie bereits auf Job DSL und Genehmigungen standardisiert haben, ist das Hinzufügen von macOS über SSH oft weniger störend als die Gründung einer zweiten CI-Religion – wenn Sie jedoch durchgängig PR-gesteuert sind, benötigen selbst gehostete Läufer möglicherweise weniger Kleber. Lesen Sie dierunner guideAbschnitte zwischenspeichern, bevor Sie Knoten registrieren; Die meisten Verzeichnisverträge werden direkt übersetzt.
Die nächste Tabelle sperrt den Vergleich, sodass Sie eine Kontrollebene auswählen können, ohne die Logos jedes Quartal erneut anzufechten.
Es gibt kein Allheilmittel – Sie entscheiden sich für einesmentales Orchestrierungsmodell and a credential boundary, kein Logo. Schreiben Sie drei SLAs in die Überprüfung: Warteschlangenlatenz, erklärbare Fehler und Schlüsselrotationskosten.
| Dimension | Jenkins + SSH-Agent (macOS) | Selbstgehosteter GitHub Actions-Runner |
|---|---|---|
| Event model | Generische Webhooks, Cron, parametrisierte Builds; steckbar auf allen Git-Hosts | Eng gekoppelt an GitHub-Events (PR, Push, Release); höhere Migrationskosten anderswo |
| Credentials | Der Controller speichert zentral SSH-Schlüssel und -Rollen – härten Sie die Controller-Ebene | Runner-Tokens und Organisations-/Repo-Bereiche sind relativ standardisiert |
| Parallelität und Warteschlangen | Labels + Knotenkapazität + Drosselungs-Plugins – flexibel, aber konfigurationsintensiv | Matrizen und Parallelität leben in YAML mit einer sanfteren Lernkurve |
| Observability | Die Build-Log-Aggregation ist ausgereift. Metriken/Benachrichtigungen sind selbstgemacht | Plattform-UI und APIs sind vereinheitlicht; Für eine umfassende Individualisierung sind oft Dritte erforderlich |
| Best fit | Mehrere Produktlinien, Artefaktspeicher vor Ort, gemischte Git-Hosts, umfangreiche Genehmigungen | GitHub-zentrierte Engineering-Organisationen mit PR-gesteuerter Bereitstellung |
Einen Mac „wie einen VPS“ zu mieten bedeutet in Jenkins‘ Begriffen den Kauf einesregistrierbares Knotenprofil: festes SSH, vorhersehbare Festplattenebenen und die Möglichkeit, Toolchain-Versionen in Knotenmetadaten zu stempeln.
Wenn Jenkins Ihre Bewertung gewinnt, behandeln Sie ihnnode propertiesals erstklassig: Xcode-Pfad, Swift-Version, Ruby/Bundler, wenn CocoaPods beteiligt ist, und ob GUI-Jobs zulässig sind – alles sollte in einer Integritätsjob-Ausgabe bestätigt werden. Kombiniere es mitSnapshots im Vergleich zu langlebigen Knoten: Langlebige Agenten setzen auf eine schrittweise Bereinigung; Snapshot-Grundlinien basieren auf erneut erhitzten Bildern und Rollback-Rauchtests.
Wenn Sie sowohl Runner als auch Jenkins in derselben Flotte betreiben müssen, vereinheitlichen Sie sieDerivedData-BucketingVerträge: separate Unix-Benutzer oder separate Roots statt „Ich hoffe, gestaffelte Zeitpläne vermeiden Kollisionen.“
Die Reihenfolge ist wichtig: Identität und Verzeichnisse zuerst, Toolchain-Prüfungen zweitens, Parallelität zuletzt. Ausrichten mitreproducible buildsDamit beweist Jenkins nicht nur, dass „SSH funktioniert“, sondern auch die Signierung bleibt instabil.
Erstellen Sie einen dedizierten Benutzer und ein Arbeitsstammverzeichnis: e.g. /Users/ci/jenkins; forbid sharing ~/Desktopmit Menschen; Der Controller verwendet nur die schlüsselbasierte Authentifizierung.
Erstellen Sie den Jenkins-Knoten: launch via SSH, legen Sie Host, Anmeldeinformationen, Remote-Root und JVM-Pfad für die macOS-Seite fest.
Label for intent: at least ios, xcode-16, heavy-pod– Trennen Sie Installationen mit starken Abhängigkeiten von reinen Kompilierungsjobs.
Führen Sie zuerst einen Gesundheitsjob aus: print xcode-select -p, swift --version, Festplatten- und Speicher-Snapshots; Bewahren Sie das Protokoll als Abnahmenachweis auf.
Übergeben Sie explizite DerivedData in Pipelines: match SwiftPM/Pods-Governance–Bucket pro Repo, Standard vermeiden~/Library/Developer/Xcode/DerivedData sharing.
Definieren Sie Zeitüberschreitungen, Archive und Bereinigung:Hochladen von Protokollen, Aufbewahrung bei Fehlern und Stoppplanungsregeln, wenn die Festplatte Ihr Wasserzeichen überschreitet.
pipeline {
agent { label 'ios && xcode-16' }
options { timestamps(); timeout(time: 45, unit: 'MINUTES') }
environment { DERIVED_DATA = "${WORKSPACE}/DerivedData" }
stages {
stage('Probe') { steps { sh 'xcode-select -p; xcodebuild -version; df -h' } }
stage('Build') {
steps {
sh 'xcodebuild -scheme "App" -configuration Release -destination "generic/platform=iOS" -derivedDataPath "$DERIVED_DATA" build'
}
}
}
post { always { archiveArtifacts artifacts: '**/build.log', allowEmptyArchive: true } }
}
Tip:Wenn Pipelines auch an Geschäfte geliefert werden, lesen SieFastlane + CIund richten Sie Build-Benutzer, Schlüsselbundpartitionen und App Store Connect-API-Schlüssel mit Jenkins-Anmeldeinformationsdomänen aus.
Führen Sie an Controller-Upgrade-Tagen dasselbe Commit vor/nach Upgrades durch und vergleichen Sie die Fingerabdruck-Ausgabe mit den Build-Time-Verteilungen. Gegenrunner caching: Jenkins Workspace Wipes, die zu aggressiv sind, erzwingen Volllastpod installjeder Lauf; Löschvorgänge, die zu konservativ sind, füllen Festplatten – definieren Sie Aufbewahrungsstufen mit Plattform und Produkt.
Wenn Anbieter nicht standardmäßige SSH-Ports und Nicht-Root-Benutzer bereitstellen, speichern Sie Verbindungsmetadaten in Anmeldeinformationsbeschreibungen – und nicht über mehrere Jobs verteilt. Kombiniere es mit demSSH checklist for known_hostsRichtlinie anstelle der globalen Deaktivierung von Host-Schlüsselprüfungen.
Der klassische Fehler besteht darin, die Parallelität anhand von „wie viele“ zu dimensionierenxcodebuildProzesse passen.“ In Wirklichkeit,pod install/ SPM löst Spitzenwerte auf und kompiliert sie in verschiedenen Phasen – verwenden Sie Drosseln und Beschriftungen zur Modellierungmutex resources. Pair with SwiftPM/Pods-Governanceum schwere Auflösungsjobs von schnellen, grünen Builds zu isolieren.
Simulatorlastige UI-Tests verändern die Parallelitätsgeschichte im Vergleich zu reinen Kompilierungsjobs; folgenXCTest / SimulatorSharding-Anleitung und isolieren Sie diese Jobs mit ihren eigenen Labels oder untergeordneten Knotenpools.
Warning:Führen Sie die Planung nicht fort, wenn die Festplatte unter Ihrem Sicherheitsgrenzwert liegt – unterbrechen Sie die Planung und bereinigen Sie sie zuerst. Andernfalls können Xcode und Git den Status halb schreiben, was mehr kostet als eine kurze Warteschlange.
Flotten mit mehreren Regionen sollten codierenregionB. in Knotennamen und -bezeichnungen, und kennzeichnen Sie Artefakt-Ausgangspfade, um zu vermeiden, dass versehentliche regionsübergreifende Massenkopien fälschlicherweise als Build-Fehler angesehen werden. Mitrent vs buy TCOIntegrieren Sie Latenz und Ausgangsbandbreite frühzeitig in das Kostenmodell.
Passen Sie die Schwellenwerte an Ihre Parallelität und Repo-Größen an. Diese Anker bringen Sicherheits- und Plattformteams zusammen. Für EU-lastige Organisationen loggen Sie sich einwelche Maschinen welche signierenden Identitäten berührt habenUm DSGVO-Prüfungsfragen zu unterstützen, sollten Remote-Knoten keine anonymen Haustiere sein.
xcodebuild -version, swift --version, Ruby/Bundler, wenn CocoaPods im Spiel ist, und Festplattenmodell; Führen Sie Canary-Jobs nach jeder Änderung erneut aus.Büro-Laptops und einmalige Mac Minis führen zu Ruhezustand, Netzwerk-Jitter und Toolchain-Drift; Pure Linux kann den offiziellen iOS-Stack von Apple nicht ausführen. Behalten Sie Jenkins unter Linux bei, während Sie macOS-Builds nach verschiebendediziert, immer verfügbar, über SSH erreichbarnodes verwandelt „wir brauchen irgendwo einen Mac“ in einen Betriebsvertrag. Im Vergleich zu Ad-hoc-Hardware oder instabilen virtualisierten HostsNodeMinis Mac Mini Cloud-Vermietungkombiniert festes SSH, klare Festplattenebenen und wiederholbare Profile – besser für CI auf Plattformniveau. Vergleichen Sie die Stufen inrental rates and onboard via the help center.
Binden Sie dieses Runbook an interne „Toolchain-Änderungsebenen“: Xcode-Patch vs. kleinere vs. größere Upgrades sollten unterschiedliche Genehmigungen, Canary-Bereiche und Cache-Ungültigmachungsregeln enthalten.
Nicht automatisch. Jenkins gewinnt bei steckbaren Pipelines und On-Prem-Integration; Actions gewinnt bei PR-nativen Events. Wenn Sie bereits über Job DSL verfügen, sind SSH-Agenten oft reibungsloser; Wenn Sie sich auf GitHub konzentrieren, benötigen Läufer möglicherweise weniger Kleber. Vergleichen Sie die Hardwarestufen inrental rates.
Ja – trennen Sie Home und Schlüsselbund von persönlichen Konten, um Ruhezustand, GUI-Eingabeaufforderungen und Berechtigungsabweichungen zu vermeiden. Orientieren Sie sich an der SSH-Checkliste und den Artikeln zu reproduzierbaren Builds. Weitere Onboarding-Details finden Sie imhelp center.
Baseline-Einzeljob-Spitzen-RAM und NVMe-Schreibverstärkung, dann Skalierung der Parallelität, während P95 beobachtet wird; Bucket DerivedData und drosseln schwere Pod-Installationen. Lesen Sie auch dieself-hosted runnerArtikel für Cache-Muster, die Jenkins-Labels zugeordnet sind.