DevOps / CI·CD 20. Mai 2026

2026-05-20 Xcode-16-Pfade für Provisioning Profiles und parallele Multi-Lane-Archive auf einem headless gemieteten Apple-Silicon-Cloud-Mac (HK / JP / KR / SG / US)

MacXCode Engineering-Team 20. Mai 2026 ~18 Min. Lesezeit

Teams, die Mac mini M4-Builder in Hongkong, Tokio, Seoul, Singapur oder den Vereinigten Staaten mieten und Xcode 16 headless betreiben, treffen auf eine leise Breaking Change: Provisioning Profiles „leben“ nicht mehr nur unter dem Legacy-Baum MobileDevice. Xcode 16 liest und schreibt den kanonischen Speicher unter UserData, während ältere Skripte, Fastlane-Helfer und Drittanbieter-CLIs .mobileprovision-Dateien weiter in den Pfad vor Xcode kopieren. Sobald Sie auf einem gemieteten Host mehrere parallele xcodebuild archive-Lanes hinzufügen, wird diese Pfad-Drift zu Signatur-Rennen, Phantomfehlern „Profil nicht gefunden“ und sporadischen errSecInternalComponent-Fehlern, die sich auf dem Entwickler-Laptop nie reproduzieren. Dieses Runbook 2026-05-20 formuliert die Policy vorweg: Profile in UserData und Legacy spiegeln, bis jedes Tool auf dem Host Xcode-16-bewusst ist, CI-Schlüsselbunde pro Lane sowie DerivedData-Wurzeln isolieren und parallele Archive-Lanes auf einem Standard-Mac mini M4 auf zwei begrenzen, sofern keine gemessene NVMe- und Unified-Memory-Reserve vorliegt. Sie erhalten eine Pfadvergleichstabelle, eine Multi-Lane-Matrix, Headless-Signatur-Triage, einen Acht-Schritte-Rollout und FAQ-Antworten, abgestimmt mit unserer Keychain- und Provisioning-CI-Baseline, dem Leitfaden automatische vs. manuelle Signierung und dem Artikel zur Disziplin paralleler xcodebuild-Jobs.

Wer Provisioning-Pfad-Drift auf einem gemieteten Headless-Mac trifft

Das Versagen meldet sich selten als „falsches Verzeichnis“. Stattdessen gelingt Lane B das Archiv, während Lane A No profile for team 'XXXXXXXXXX' matching meldet, obwohl beide Jobs dieselbe UUID importiert haben. Auf einem gemieteten Host ist die Wirkung größer: Golden Images backen Helper-Skripte von 2024 ein, Jenkins-Plugins rufen weiter ~/Library/MobileDevice/Provisioning Profiles auf, und die Fastlane-Lane eines Neuzugangs lädt nach UserData, während ein nächtlicher Cron nur den Legacy-Ordner aktualisiert. Multi-Branch-CI mit einem gemeinsamen macOS-Benutzerkonto verstärkt die Drift, weil jede Lane dasselbe Home-Verzeichnis liest, sofern Sie Pfade nicht bewusst trennen.

  • Release-Ingenieure, die zwei oder mehr parallele Archive für unterschiedliche Bundle-IDs auf einem Mac mini M4 fahren, brauchen deterministische Profilauflösung pro Lane.
  • Plattform-Teams, die Golden Images pflegen, müssen dokumentieren, welchen Pfad Xcode 16, xcodebuild und Hilfstools während archive und exportArchive lesen.
  • Security-Reviewer verlangen den Nachweis, dass Lane A das Distributionszertifikat von Lane B nicht lesen kann — pro Lane getrennte Schlüsselbunde sind bei Hot-Swap-Profilen nicht verhandelbar.

Beginnen Sie jedes Design-Review beim Versprechen der MacXCode-Startseite: Apple Silicon nah an Apple-APIs, und ordnen Sie dann zu, welche Signatur-Artefakte mit dem Checkout auf dem Miet-Host colokiert sein müssen. Wenn Sie Profile nur nach MobileDevice kopieren, werten Sie das als technische Schuld, die zuverlässigen Multi-Lane-Durchsatz blockiert — unser Leitfaden Remote-Archive liegt vor der UserData-Verschiebung und sollte mit diesem Update gelesen werden.

Legacy MobileDevice vs. Xcode-16-UserData-Profilpfade

Xcode 16 behandelt ~/Library/Developer/Xcode/UserData/Provisioning Profiles als primären On-Disk-Speicher, wenn Sie Profile aus dem Xcode-Konto-Bereich laden oder xcodebuild -allowProvisioningUpdates Entitlements aktualisiert. Der Legacy-Pfad ~/Library/MobileDevice/Provisioning Profiles bleibt relevant, weil viele CI-Rezepte, ältere Fastlane-Actions und interne Shell-Installer ausschließlich dort hinschreiben. Bis Sie jeden Einstieg auditiert haben, ist die sichere Betriebsvorgabe byte-identische Kopien in beiden Bäumen nach jeder Profilrotation, mit dem UUID-Dateinamen aus dem Apple-Plist (security cms -D -i datei.mobileprovision → Schlüssel UUID).

Pfad Typischer Konsument Verhalten Xcode 16 CI-Hinweis auf Miet-Hosts
~/Library/Developer/Xcode/UserData/Provisioning Profiles Xcode-IDE, modernes xcodebuild Kanonisches Lesen/Schreiben für GUI-Downloads xcode-select vor dem Kopieren pinnen; per Konten-Export prüfen
~/Library/MobileDevice/Provisioning Profiles Legacy-Skripte, manche Fastlane-Versionen Von vielen CLI-Flows weiterhin akzeptiert Hier spiegeln, bis Skripte außer Betrieb sind
Lane-Staging (z. B. /var/ci/lane-a/profiles) Eigene Installer vor dem Kopieren Wird nicht direkt gelesen; reduziert Home-Verzeichnis-Rennen Pro Lane-Job in beide kanonische Pfade kopieren
ASC-API + -allowProvisioningUpdates Automatische Signatur-Pipelines Kann nur UserData füllen API-Keys abschotten; siehe Fastlane vs. natives ASC
Zahlen-Leitplanke: behalten Sie bei Distribution-Profil-Rotationen 7–14 Tage überlappende Gültigkeit; Lanes, die mitten in der Rotation starten, dürfen die vorherige UUID nicht löschen, bevor alle laufenden Archive fertig sind. Protokollieren Sie die drei neuesten Profil-mtime-Werte neben security find-identity -v -p codesigning wie in der Keychain-Baseline.

Matrix paralleler Multi-Lane-Archive auf einem Mac mini M4

Parallele Archive sind auf einem gemieteten Mac mini M4 keine „kostenlose Parallelität“: Unified Memory, NVMe-Warteschlangentiefe und Signatur-Session-Zustand serialisieren weiter unter Last. Die Matrix unten setzt voraus, dass jede Lane ein dediziertes -derivedDataPath, einen eigenen CI-Schlüsselbund und gespiegelte Profile nutzt — Muster aus unserem Parallel-Jobs-Leitfaden und dem Artikel Schema + xcconfig für mehrere Branches.

Anzahl Lanes Typische NVMe-Reserve Unified Memory Operator-Urteil
1 serielles Archiv 120 GB+ frei auf dem Systemvolume 16 GB Minimum; 24 GB komfortabel Standard für gemeinsame Release-Züge; einfachste Logs
2 parallele Archive 120–180 GB frei pro Lane unter /var/ci 24 GB+ empfohlen Praktisches Limit auf Serien-M4; DerivedData + Schlüsselbunde isolieren
3+ parallele Archive NVMe-Klasse 2 TB; aggressives Aufräumen 32 GB+ oder Kompressions-Stalls erwarten Nur nach Messung; Speicherhygiene planen
Archive + schwerer Test-Shard Getrennte Wurzeln; ModuleCache nie teilen 4 GB Puffer für XCTest freilassen Serielles Archiv nach Tests oder getrennte Hosts bevorzugen

Beispiel für eine lane-spezifische Archive-Zeile (manuelle Signatur mit explizitem Specifier):

KEYCHAIN_PATH=/var/ci/lane-a/ci.keychain-db DERIVED=/var/ci/lane-a/dd xcodebuild -workspace App.xcworkspace -scheme Release -configuration Release -archivePath /var/ci/lane-a/out/App.xcarchive -derivedDataPath "$DERIVED" CODE_SIGN_STYLE=Manual PROVISIONING_PROFILE_SPECIFIER='MyApp AppStore' archive

Headless-Signatur-Triage, wenn Profile „installiert“ wirken

SSH-Sitzungen fühlen sich interaktiv an; launchd und CI-Runner nicht. Die häufigsten Headless-Fehler nach einem Xcode-16-Upgrade: Profile nur nach MobileDevice kopiert, Distributionsidentitäten im Login-Schlüsselbund importiert, während xcodebuild auf einen leeren CI-Schlüsselbund zeigt, und Lane B entsperrt einen Schlüsselbund, den Lane A noch exklusiv braucht. Behandeln Sie jedes Archiv als dreiteiligen Fingerabdruck: security list-keychains, security find-identity -v -p codesigning und ls -lt beider Profilordner auf die drei neuesten UUIDs begrenzt.

Wenn codesign errSecInternalComponent ausgibt, entsperren Sie den CI-Schlüsselbund vor dem Archiv non-interaktiv, setzen Sie Partition-Listen für codesign-Zugriff, und prüfen Sie, ob die Entitlements des Provisioning Profiles zu den Fähigkeiten des Targets passen — insbesondere Push, App Groups und Associated Domains nach Portal-Änderungen. Automatische Signatur mit ASC-API kann Pfad-Drift bis zum Export maskieren; manuelle Lanes zeigen sie sofort. Lesen Sie automatisch vs. manuell, bevor Sie Stile auf einem Host mischen.

Niemals zwei Lanes gegen denselben Login-Schlüsselbund auf einer gemeinsamen Mietmaschine laufen lassen. Legen Sie ci-lane-a.keychain-db und ci-lane-b.keychain-db unter /var/ci an, importieren Sie Distributions-.p12 mit security import -k "$KEYCHAIN_PATH" -P "$P12_PASS" -T /usr/bin/codesign, und begrenzen Sie security list-keychains -s auf die Job-Laufzeit.
Symptom Wahrscheinliche Ursache Nächster Befehl oder Fix
Profil fehlt im Xcode-Report UserData leer; nur Legacy-Installation UUID-Datei nach UserData spiegeln; Archiv erneut ausführen
errSecInternalComponent Gesperrter Schlüsselbund oder falsche Partition-Liste security unlock-keychain -p "$PASS" "$KEYCHAIN_PATH"; set-key-partition-list
Lane A ok, Lane B scheitert am selben Commit Geteiltes DerivedData oder Profil-Race -derivedDataPath trennen; Profilkopie serialisieren
Export ok, Upload abgelehnt Falscher Profiltyp oder abgelaufene Entitlements Mit Export + ASC-Upload-Checkliste prüfen

Nach dem Archiv dSYMs hochladen, bevor Sie Lane-Ordner löschen — unser dSYM-Symbolikations-Leitfaden setzt voraus, dass Archive pro Lane unter /var/ci/…/out adressierbar bleiben.

Acht-Schritte-Rollout für Xcode-16-Pfade + Multi-Lane-Archive

  1. xcode-select -p auf die gewünschte Xcode 16.app pinnen; xcodebuild -version im Golden-Image-Manifest festhalten.
  2. Jedes Skript prüfen, das .mobileprovision kopiert; Installer so aktualisieren, dass sie beide Pfade UserData und MobileDevice mit UUID-Dateinamen beschreiben.
  3. CI-Schlüsselbunde pro Lane anlegen und Distributionszertifikate importieren; Lanes den Zugriff auf fremde Schlüsselbunddateien verweigern.
  4. KEYCHAIN_PATH, PROVISIONING_PROFILE_SPECIFIER (oder Profil-UUID) und lane-spezifisches DERIVED_DATA_ROOT in CI-Umgebungsblöcken exportieren.
  5. Trockenlauf xcodebuild -showBuildSettings pro Lane; CODE_SIGN_STYLE gegen die Policy aus dem Leitfaden Signaturmodus prüfen.
  6. -allowProvisioningUpdates nur aktivieren, wenn ASC-API-Zugangsdaten abgeschottet und überwacht sind — siehe natives ASC vs. Fastlane.
  7. Mit einer Archive-Lane starten, bis Profil-Spiegelung stabil ist; Lane zwei mit separaten NVMe-Wurzeln und Logdateien hinzufügen.
  8. Wöchentliche Speicherbereinigung planen und Profile mit Überlapp rotieren; Hot-Swap-Kopien in Lane-Staging-Verzeichnissen halten.

Muster für non-interaktive Profilinstallation (Pfade durch Ihr Lane-Staging ersetzen):

UUID=$(security cms -D -i "$PROFILE" | plutil -extract UUID raw -) && cp "$PROFILE" "$HOME/Library/Developer/Xcode/UserData/Provisioning Profiles/$UUID.mobileprovision" && cp "$PROFILE" "$HOME/Library/MobileDevice/Provisioning Profiles/$UUID.mobileprovision"

FAQ

Wo speichert Xcode 16 Provisioning Profiles? Primärpfad ist ~/Library/Developer/Xcode/UserData/Provisioning Profiles. Legacy-Tools können weiter ~/Library/MobileDevice/Provisioning Profiles lesen — auf CI-Hosts beide spiegeln, bis alle Installer aktualisiert sind.

Wie viele parallele Archive-Lanes passen auf einen Mac mini M4? Zwei Lanes mit je 120–180 GB NVMe-Reserve sind ein praktischer Standard; eine dritte Lane braucht 2 TB Speicher, aggressives Aufräumen und sorgfältiges Speicher-Budget laut Matrix oben.

Warum schlägt codesign per SSH mit errSecInternalComponent fehl? Meist gesperrter Schlüsselbund, fehlende Partition-Liste für den CI-Schlüsselbund oder Profile nur unter dem Legacy-Pfad, während Xcode 16 zuerst UserData auflöst.

Sollen Lanes DerivedData teilen, um Builds zu beschleunigen? Nein für Release-Archive — ModuleCache und Index-Stores racen bei parallelen Archiven. Pro Lane -derivedDataPath nutzen und optionale gemeinsame read-only-Abhängigkeits-Caches erst nach einem einzelnen Writer für Paketauflösung.

Für Navigation: Blog-Index und Hilfe-Center bookmarken, damit Bereitschaft dieses Runbooks ohne Chat-Suche findet.

Warum Mac-mini-M4-Mieten zu Multi-Lane-Xcode-16-Archiven passen

Apple Silicon M4 liefert genug Unified-Memory-Bandbreite, um zwei mittlere iOS-Graphen parallel zu kompilieren, wenn Sie DerivedData isolieren und Lanes ehrlich begrenzen. Native macOS-Code-Signatur vermeidet Hypervisor-Schlüsselbund-Eigenheiten, die emulierte Mac-Umgebungen plagen — relevant, wenn drei Nightly-Branches jeweils ein frisches Distribution-Profil brauchen. Mieten entfernt CapEx in intensiven Release-Wochen: Builder in Tokio für App-Store-Connect-Nähe, Singapur für ASEAN-Egress oder den Vereinigten Staaten für US-West-API-Endpunkte hochfahren und nach dem Zug wieder herunterskalieren. Regionen auf der Seite Preise vergleichen, SSH im Hilfe-Center proben und diesen Artikel mit Remote-Archive-Workflows koppeln, wenn ein neues Repo auf einer headless Mietmaschine ankommt.

Apple Silicon mieten, wo Xcode-16-Signatur planbar bleibt

HK / JP / KR / SG / US · headless SSH · Multi-Lane-Archive bereit