DevOps & Audit

Xcode 27 und Xcode 26 gemeinsam nutzen? Remote-Mac-CI-Konfiguration 2026

MacHTML Lab2026.09.01 ~15 Min. Lesezeit
Xcode 27 und Xcode 26 gemeinsam nutzen? Remote-Mac-CI-Konfiguration 2026

Apple bestätigt für Xcode 27 eine Beschränkung auf kompatible Apple-Silicon-Macs. Daraus folgt die wichtigste Entscheidung: Xcode 27 und Xcode 26 können auf demselben geeigneten Mac koexistieren. Ihre Produktionspipeline sollte jedoch nicht regelmäßig das globale xcode-select umschalten. Verwenden Sie getrennte App-Verzeichnisse, setzen Sie DEVELOPER_DIR pro Auftrag und prüfen Sie Komponenten, Caches, Signierung sowie Rollback jeweils nachweisbar anhand der offiziellen Xcode-Systemanforderungen und der Xcode-27-Versionshinweise.

Wer sollte diesen Leitfaden lesen?
Wenn Sie weiterhin mit Xcode 26 veröffentlichen und parallel Projekte mit Xcode 27 Beta testen, finden Sie hier eine belastbare Trennung der Toolchains.
Der Text richtet sich außerdem an DevOps-Verantwortliche für Remote Mac CI sowie an Plattformteams, die Kapazität, Upgrades und Wiederherstellung eines gemeinsam genutzten Mac-Knotens betreuen.

Zuletzt aktualisiert am 01.09.2026. Die Aussagen zu Systemanforderungen, Apple-Silicon-Unterstützung, Kommandozeilen-Auswahl und Zusatzkomponenten wurden anhand der verlinkten Apple-Dokumentation geprüft. Beta-Verhalten und unterstützte Systembereiche können sich mit neuen Xcode-27-Versionen ändern.

Der eigentliche Fehler: Die Pipeline nennt Xcode 26, baut aber mit Xcode 27

Ein typischer Vorfall sieht so aus: Ein Release-Job meldet „Xcode 26“, im Protokoll erscheint jedoch ein SDK-Pfad aus Xcode 27. Der Build läuft zunächst weiter. Erst beim Signieren, beim Archivieren oder auf einem älteren Testgerät fällt auf, dass die erwartete Umgebung nicht verwendet wurde.

Das Problem ist nicht zwingend eine fehlerhafte Installation. Häufig vermischen sich mehrere Auswahlmechanismen:

  • xcode-select legt einen globalen Entwicklerpfad für den Host fest.
  • Eine interaktive Shell kann eigene Umgebungsvariablen oder Profile laden.
  • Der CI-Runner startet Unterprozesse mit einer anderen Umgebung.
  • Skripte rufen xcodebuild oder xcrun ohne explizite Pfadangabe auf.
  • Caches und DerivedData können Artefakte einer anderen Xcode-Version wiederverwenden.

Ihre Pipeline muss deshalb nicht nur „Xcode 26“ als Text ausgeben. Sie sollte vor dem Build den tatsächlich verwendeten Entwicklerpfad, die Xcode-Version, den Build-Stand, das SDK und den Compiler protokollieren. Erst diese Kombination beweist, dass der Auftrag mit der vorgesehenen Toolchain gestartet wurde.

Für einen exklusiv verwendeten Knoten kann ein fester Host-Standard vertretbar sein. Auf einem gemeinsam genutzten Remote Mac CI ist die Aufgabe jedoch die bessere Isolationseinheit. So kann ein Release-Job Xcode 26 verwenden, während ein Validierungsjob Xcode 27 Beta nutzt, ohne den globalen Zustand des Rechners zu verändern.

Zwei Installationen, zwei Risiken: App-Pfad und macOS-Kompatibilität

Eine parallele Installation ist nur dann stabil, wenn die beiden Xcode-Anwendungen nicht denselben Namen und nicht denselben Aktualisierungspfad verwenden. Benennen Sie die Anwendungen eindeutig, zum Beispiel:

/Applications/Xcode-26.app
/Applications/Xcode-27-Beta.app

Die Namen sind Platzhalter. Verwenden Sie in Ihrer Umgebung die tatsächlich geprüften Versionen und Build-Stände. Entscheidend ist, dass ein Update nicht versehentlich die andere Anwendung überschreibt.

Vor der Installation prüfen Sie drei Ebenen:

  1. Architektur des Remote Mac: Xcode 27 setzt laut Apple-Dokumentation einen kompatiblen Apple-Silicon-Mac voraus.
  2. macOS-Version: Die unterstützte macOS-Spanne muss für jede installierte Xcode-Version separat erfüllt sein.
  3. Projektanforderungen: SDK, Simulator-Runtime, Signing-Workflow und verwendete Plugins müssen zur jeweiligen Pipeline passen.

Die Xcode-26-Versionshinweise und die Xcode-27-Versionshinweise sind dabei wichtiger als eine allgemeine Aussage wie „die aktuelle macOS-Version sollte funktionieren“. Während der Beta-Phase dürfen Sie aus einer erfolgreichen lokalen Installation keine endgültige Kompatibilitätszusage ableiten.

Unterscheiden Sie außerdem zwischen drei Vorgängen:

  • Erstinstallation: App-Pfad, Downloadquelle, Build-Stand und Systemvoraussetzungen dokumentieren.
  • Überdeckendes Update: Nur durchführen, wenn die bestehende Pipeline danach erneut vollständig validiert wird.
  • Automatische Aktualisierung: Für produktive Toolchains vermeiden, sofern sie die kontrollierte Version verändern kann.

Nicht unterstützte macOS-Versionen sollten Sie nicht durch manipulierte App-Bundles, geänderte Metadaten oder andere inoffizielle Verfahren erzwingen. Ein solcher Knoten ist für reproduzierbare CI ungeeignet, selbst wenn Xcode scheinbar startet.

Schritt eins: Einen unveränderlichen Versionsvertrag für jeden Job festlegen

Legen Sie nicht nur in der Dokumentation, sondern im Repository oder in der Runner-Konfiguration fest, welche Pipeline welche Xcode-Anwendung verwendet. Ein Beispiel mit absichtlich fiktiven Namen:

export DEVELOPER_DIR="/Applications/Xcode-26.app/Contents/Developer"

xcodebuild -version
xcrun --find xcodebuild
xcrun --sdk iphoneos --show-sdk-path
swiftc --version

Für die Beta-Pipeline ersetzen Sie den Pfad durch:

export DEVELOPER_DIR="/Applications/Xcode-27-Beta.app/Contents/Developer"

DEVELOPER_DIR wirkt auf die Prozesse, die diese Umgebung erben. Das ist auf einem gemeinsam genutzten Knoten sicherer als ein globales Umschalten. Apple beschreibt die Auswahl der Kommandozeilen-Tools in der Dokumentation zu Command-Line-Tools-Einstellungen. Die Variablen müssen trotzdem innerhalb jedes CI-Auftrags gesetzt werden, statt auf eine zufällige Shell-Voreinstellung zu vertrauen.

Sollten Sie DEVELOPER_DIR oder xcode-select verwenden?
Verwenden Sie DEVELOPER_DIR, wenn mehrere Aufträge unterschiedliche Xcode-Versionen benötigen oder parallel laufen können. Verwenden Sie xcode-select höchstens als bewusst gesetzten Standard für einen dedizierten Knoten oder für administrative Prüfungen. Ein Release-Skript sollte nicht den globalen Zustand verändern und anschließend darauf hoffen, dass kein anderer Auftrag dazwischenkommt.

Eine klare Entscheidungshilfe für den gemeinsamen Knoten

Prüfen Sie die folgenden Bedingungen vor der Freigabe. Setzen Sie ein Häkchen nur, wenn der Nachweis im Preflight oder in einem gespeicherten CI-Artefakt vorhanden ist:

  • [ ] Der Mac erfüllt die von Apple dokumentierten Architektur- und macOS-Anforderungen für Xcode 26 und Xcode 27.
  • [ ] Beide Anwendungen liegen in getrennten, eindeutig benannten Verzeichnissen.
  • [ ] Jede Pipeline setzt DEVELOPER_DIR selbst und protokolliert den vollständigen Developer-Pfad.
  • [ ] xcodebuild, xcrun, SDK und Swift-Compiler werden vor dem eigentlichen Build aus derselben Toolchain aufgelöst.
  • [ ] DerivedData, Archive, Logs und projektspezifische Arbeitsverzeichnisse sind nach Toolchain oder Pipeline getrennt.
  • [ ] Die benötigten Simulator-Runtimes und Zusatzkomponenten wurden für jede Xcode-Version separat geprüft.
  • [ ] Archivierung, Tests und Signierung funktionieren mit beiden vorgesehenen Routen.
  • [ ] Ein Neustart, ein Beta-Update und ein anschließender Rollback wurden erfolgreich wiederholt.

Wenn alle Punkte erfüllt sind, können Sie Xcode 26 und Xcode 27 auf einem gemeinsam genutzten Mac betreiben.
Wenn nur die ersten fünf Punkte erfüllt sind, beschränken Sie Xcode 27 auf nichtproduktive Validierung und verwenden Sie Xcode 26 weiterhin für Releases.
Wenn DEVELOPER_DIR, Cache-Trennung oder Signierung nicht nachweisbar funktionieren, verwenden Sie einen exklusiven Knoten pro Toolchain oder verschieben Sie die Beta-Pipeline auf einen separaten Remote Mac.
Wenn Architektur oder macOS-Kompatibilität nicht erfüllt sind, brechen Sie die Installation ab. Ein manipuliertes Bundle ist kein belastbarer Ausweg.

Der Vorabtest: Erst lesen, dann bauen

Bauen Sie nicht sofort. Führen Sie einen schreibenden Vorgängen vorgeschalteten, möglichst lesenden Preflight aus. Der Test sollte mindestens diese Informationen als CI-Artefakt speichern:

set -eu

test -d "$DEVELOPER_DIR"
test -x "$DEVELOPER_DIR/usr/bin/xcodebuild"

printf 'DEVELOPER_DIR=%s\n' "$DEVELOPER_DIR"
xcodebuild -version
xcrun --find xcodebuild
xcrun --find clang
xcrun --sdk iphoneos --show-sdk-path
swiftc --version

Prüfen Sie anschließend, ob der erwartete SDK-Pfad tatsächlich unter dem ausgewählten Developer-Verzeichnis liegt. Für projektspezifische Einstellungen dokumentiert Apple relevante Zusammenhänge in der Build-Settings-Referenz. Das betrifft unter anderem Pfade, SDK-Auswahl und Einstellungen, die ein Projekt über Konfigurationsdateien oder Kommandozeilenparameter einbringen kann.

Ein fehlgeschlagener Preflight darf nicht in einen normalen Build übergehen. Stoppen Sie den Auftrag. Ein grünes Ergebnis mit falschem SDK ist gefährlicher als ein roter Job, weil dadurch ein scheinbar gültiges Archiv entsteht, dessen Herkunft später schwer nachvollziehbar ist.

Schritt zwei: Komponenten und Simulatoren pro Xcode-Version prüfen

Eine geöffnete Xcode-App beweist nicht, dass der CI-Knoten vollständig vorbereitet ist. Für Archivierung, Unit-Tests und UI-Tests gelten unterschiedliche Anforderungen. Installieren Sie daher nicht automatisch jede verfügbare Runtime auf dem gemeinsam genutzten Host.

Prüfen Sie für jede Toolchain:

  • Ist die benötigte Plattformkomponente installiert?
  • Wurde die Anwendung mindestens einmal mit dem vorgesehenen Benutzer initialisiert?
  • Ist die erforderliche Simulator-Runtime vorhanden?
  • Kann der Zielsimulator mit genau dieser Xcode-Version gestartet werden?
  • Verwendet der Job wirklich den ausgewählten App-Pfad?

Zusatzkomponenten müssen an die richtige Xcode-Installation gebunden werden. Folgen Sie dafür Apples Anleitung zum Herunterladen und Installieren zusätzlicher Xcode-Komponenten. Für weitere Simulatoren gelten die Hinweise zum Hinzufügen zusätzlicher Simulatoren.

Legen Sie pro Pipeline fest, was benötigt wird:

  • Nur Archivierung: keine unnötigen Simulator-Runtimes auf dem Knoten.
  • Unit-Tests: die Plattform und das SDK des Testziels prüfen.
  • UI-Tests: zusätzlich Simulator-Runtime, Gerätestatus und Startfähigkeit validieren.
  • Beta-Verifikation: denselben Test mit der Xcode-27-Beta-Toolchain wiederholen.

Wenn die Speicherreserve des Knotens knapp ist, ist ein separater Validierungsknoten oft sauberer als eine ständig wachsende Sammlung von Runtimes. Das ist keine Leistungsbehauptung, sondern eine Zustandsentscheidung: Jede zusätzliche Komponente vergrößert den Prüf- und Aufräumbereich.

Schritt drei: DerivedData, Abhängigkeiten und Archive strikt trennen

Xcode-Versionen sollten nicht unkontrolliert dasselbe DerivedData-Verzeichnis verwenden. Ein bereits kompilierter Zwischenstand kann sonst eine Inkompatibilität verdecken. Der Build sieht erfolgreich aus, obwohl wichtige Dateien nicht unter der aktuell ausgewählten Toolchain entstanden sind.

Setzen Sie für jeden Job eigene Pfade, beispielsweise:

export CI_ROOT="$HOME/ci-work/example-release"
export DERIVED_DATA="$CI_ROOT/derived-data-xcode26"
export ARCHIVE_PATH="$CI_ROOT/archive-xcode26.xcarchive"

xcodebuild \
  -derivedDataPath "$DERIVED_DATA" \
  -archivePath "$ARCHIVE_PATH" \
  -scheme "ExampleApp-Release" \
  archive

Für Xcode 27 verwenden Sie einen anderen Verzeichnisnamen. Noch besser ist eine Kombination aus Pipeline-ID, Commit und Toolchain-Kennung. So verhindern Sie, dass ein wiederverwendeter Ordner alte Resultate als aktuelle Eingabe erscheinen lässt.

Trennen Sie mindestens:

  • DerivedData
  • Archive und Export-Verzeichnisse
  • Testergebnisse und Logs
  • Swift-Package- oder andere Abhängigkeits-Caches
  • temporäre Simulator-Daten

Ein gemeinsamer Download-Cache kann sinnvoll sein, wenn Ihre Richtlinien das erlauben. Ein gemeinsames Build-Ergebnis ist dagegen kein neutraler Cache. Löschen Sie für eine Erstprüfung alle abgeleiteten Artefakte und führen Sie danach einen Wiederholungsbuild mit bewusst aktiviertem Cache aus. Vergleichen Sie Logs, Toolchain-Nachweise und Artefaktpfade.

Teilen Xcode 27 und Xcode 26 Simulatoren oder DerivedData?
Bestimmte Systemzustände können auf dem Host gemeinsam sichtbar sein, aber Ihre Build-Artefakte sollten logisch und möglichst physisch getrennt werden. Simulator-Runtimes müssen für die ausgewählte Xcode-Version verfügbar und mit dem Ziel kompatibel sein. DerivedData sollte pro Toolchain oder Pipeline isoliert werden. „Gemeinsam vorhanden“ bedeutet nicht „sicher gemeinsam verwendbar“.

Schritt vier: Signierung nicht duplizieren, sondern kontrollieren

Für die beiden Xcode-Versionen brauchen Sie nicht automatisch doppelte Zertifikate oder Profile. Das eigentliche Risiko liegt in unklaren Identitäten, wechselnden Keychains und unterschiedlichen Berechtigungen des CI-Benutzers.

Prüfen Sie vor dem Archivieren:

  • Welche Keychain darf der Runner verwenden?
  • Welche Signierungsidentität ist im Auftrag vorgesehen?
  • Ist das Provisioning Profile für Bundle-ID und Zielumgebung passend?
  • Werden temporäre Signaturdateien nach dem Job entfernt?
  • Sind Logs frei von Zertifikats-, Token- oder Schlüsselmaterial?

Legen Sie keine privaten Schlüssel in das Repository. Verwenden Sie für produktive Signierung eine kontrollierte Identitätsgrenze. Beide Toolchains dürfen dieselbe freigegebene Signierungsumgebung nutzen, sofern die Validierung zeigt, dass sie mit den jeweiligen Projekt- und Export-Einstellungen korrekt arbeitet.

Die Signierung gehört in die Akzeptanzprüfung, nicht nur in den Release-Job. Ein erfolgreicher Debug-Build sagt nichts über ein korrekt exportierbares Archiv aus.

Schritt fünf: Parallelität und globalen Zustand voneinander trennen

Auf einem geteilten Remote Mac kann ein Job trotz sauberem DEVELOPER_DIR weitere globale Zustände verändern. Dazu zählen globale Xcode-Auswahl, Simulator-Boot-Zustände, Keychain-Sperren und gemeinsam genutzte Arbeitsverzeichnisse.

Ihre Runner-Definition sollte deshalb folgende Regeln erzwingen:

  1. Der Job setzt DEVELOPER_DIR selbst.
  2. Der Job prüft den Pfad unmittelbar vor xcodebuild.
  3. Der Job nutzt eigene Arbeits-, DerivedData- und Archivpfade.
  4. Globale xcode-select-Änderungen sind in normalen Jobs verboten.
  5. Bei einem Preflight- oder Signierungsfehler wird der Auftrag sofort beendet.
  6. Parallel laufende Aufträge erhalten getrennte Projekt- und Simulatorzustände.

Wenn Ihre UI-Testumgebung keine saubere Parallelität zulässt, serialisieren Sie nur diesen Teil. Ändern Sie nicht als Ausweichlösung den globalen Developer-Pfad. Die lokale Sperre eines Ressourcentyps ist nachvollziehbar; ein unsichtbarer Host-Wechsel ist es nicht.

Die Abnahmematrix: Neustart und Rollback gehören zum Test

Erstellen Sie drei klar benannte Routen:

  • Produktionsroute: Xcode 26, Release-Scheme, Archivierung und Signierung.
  • Validierungsroute: Xcode 27 Beta, separates Scheme oder klar definierter Branch.
  • Rollbackroute: Xcode 26 nach einer Beta-Aktualisierung oder einem fehlgeschlagenen Test.

Für jede Route speichern Sie:

  • erwarteten App-Pfad,
  • Xcode-Version und Build-Stand,
  • verwendetes SDK,
  • DEVELOPER_DIR,
  • Build- und Archivpfade,
  • Testresultat,
  • Signierungsresultat,
  • relevante Runner- und Systemlogs.

Führen Sie danach einen kontrollierten Neustart durch. Wiederholen Sie den Preflight, einen sauberen Build und einen Build mit dem vorgesehenen Cache. Testen Sie außerdem den Fall, dass Xcode 27 Beta aktualisiert wird. Die Beta-App darf dabei nicht den Pfad von Xcode 26 ersetzen.

Wenn die Route nach dem Neustart nicht reproduzierbar ist, vergrößern Sie nicht sofort den Rollout. Markieren Sie den Knoten als nicht abgenommen und entscheiden Sie zwischen drei Maßnahmen: gemeinsamer Betrieb mit zusätzlicher Isolation, eigener Remote-Mac-Knoten für Xcode 27 oder vorläufige Beschränkung auf Xcode 26.

Wann ein eigener Remote Mac die bessere Architektur ist

Eine gemeinsame Maschine spart Verwaltungsaufwand, erhöht aber die Zahl der Zustände, die Sie überwachen müssen. Bei mehreren Teams, häufigen Beta-Updates, UI-Test-Runtimes oder strengen Release-Zeitfenstern kann ein eigener Validierungsknoten die sauberere Grenze bilden.

Wenn Sie dafür keine zusätzliche Hardware kaufen möchten, können Sie bei MacHTML die verfügbaren Remote-Mac-Zugänge prüfen. Die Hinweise zu Zugang und Betrieb helfen Ihnen dabei, VNC, SSH und die Übergabe des Knotens vor der Einrichtung mit Ihren Runner-Anforderungen abzugleichen.

Eine Mietlösung ersetzt nicht die Abnahmematrix. Sie verschiebt lediglich die Hardwareentscheidung. Prüfen Sie deshalb weiterhin Apple-Silicon-Architektur, macOS-Kompatibilität, Root-Zugriff, Netzwerkzugang, Datenschutz nach DSGVO und die Möglichkeit, einen Beta-Knoten getrennt vom Produktionsknoten zu betreiben.

Fazit: Nicht den offiziellen Knoten umschalten, sondern den Auftrag festlegen

Xcode 27 und Xcode 26 gemeinsam zu nutzen ist auf einem kompatiblen Apple-Silicon-Mac möglich. Die robuste Lösung besteht aus unverwechselbaren App-Verzeichnissen, DEVELOPER_DIR pro Pipeline, einem lesenden Preflight, getrennten Build-Zuständen sowie einer Abnahme nach Neustart, Beta-Update und Rollback.

Ein dauerhaftes Umschalten von xcode-select macht Ihren Produktionsknoten dagegen von globalem Zustand abhängig. Auch ein gemeinsamer DerivedData-Ordner oder eine ungeprüfte Simulator-Installation kann ein falsches grünes Ergebnis erzeugen.

Wenn Ihr aktueller Ansatz auf einem einzigen Mac mini, einer gemeinsam genutzten Shell oder einem ungefilterten Cache beruht, sind die Nachteile konkret: Parallele Jobs können sich den Toolchain-Zustand streitig machen, Beta-Komponenten können Produktionsprüfungen beeinflussen und ein Neustart kann manuelle Nacharbeit erfordern. Nach bestandener Matrix ist daher eine getrennte Remote-Mac-Umgebung für Xcode 27 oft die risikoärmere Ergänzung, während Xcode 26 den Release-Knoten unverändert versorgt. Für temporäre Validierung, begrenzte Beta-Phasen oder einen kurzfristig benötigten CI-Knoten können Sie die passenden Mietbedingungen bei MacHTML vergleichen, statt den bestehenden Produktionspfad vorschnell umzubauen.

Weiterführende Links: Xcode-27- und Copilot-for-Xcode-Konflikte bei Vervollständigungen lösen Mac-mini-CI/CD: Leistungsfähige und zuverlässige Build-Pipelines einrichten Eine Remote-Mac-Umgebung für Entwicklung und automatisierte Builds konfigurieren

Ihre Xcode-CI-Umgebung auf einem Remote Mac einrichten

Mit MacHTML nutzen Sie einen leistungsfähigen Remote Mac, auf dem sich Xcode 27 und Xcode 26 getrennt und kontrolliert betreiben lassen. Führen Sie Builds und Tests in einer dedizierten Umgebung aus, ohne zusätzliche lokale Hardware dauerhaft bereitzustellen. Wechseln Sie per Fernzugriff zwischen Toolchains und prüfen Sie Konfigurationen, Caches sowie Signierung direkt auf dem Mac. Wählen Sie bei MacHTML die passende Mac-Umgebung für Ihre Entwicklungs- und CI-Anforderungen und arbeiten Sie flexibel aus der Ferne.

Cloud Mac mini mieten
Apple Silicon Cloud Mac