Kernpunkte
- Legen Sie für die CI eine eigene Schlüsselbund-Datei an, importieren Sie Distribution-Identitäten dorthin und entsperren Sie sie mit einem kurzlebigen Passwort aus Ihrem Secret-Store—verlassen Sie sich nicht auf den Standard-Login-Schlüsselbund über Neustarts hinweg.
- Signieren Sie mit explizitem
--keychainbzw.CODE_SIGN_KEYCHAINund prüfen Siesecurity find-identity -v -p codesigningin derselben Shell, in der auch der Build läuft. - Nach
xcodebuild-Archiv/Export: notarytool submit → warten → stapler staple auf dem äußeren Bundle oder der.dmg, die wirklich ausgeliefert wird; nur ein inneres Binary zu staplen ist ein häufiger Fehler. - Parallelspuren, SSD und geteilte Last auf demselben Host hängen mit Kapazitätsplanung zusammen—siehe Produktions-Docker auf Apple-Silicon-Cloud-Mac: arm64/amd64-Images, Bind-Mounts & Build-Cache — Fehlerbehebungs-Handbuch (mit Tarif-Grenzen), wenn Docker und Xcode eine Maschine teilen.

codesign -dv-Ausgaben, Notary-Log-Auszügen und Ticket-Nachweis auf dem ausgelieferten Artefakt verifizieren.1. Schlüsselbund-Grenzen auf unbeaufsichtigten Hosts
Niemand sitzt an der Konsole des Cloud-Mac-CI, daher bricht alles, was UI-Freigaben oder den Login-Sitzungs-Schlüsselbund stillschweigend voraussetzt, nach Image-Refreshs oder Neustarts weg. Standardisieren Sie auf einen Datei-Schlüsselbund (z. B. ~/Library/Keychains/ci-signing.keychain-db), importieren Sie Apple-Distribution-Zertifikat und privaten Schlüssel, setzen Sie ein bekanntes Passwort und entsperren Sie zu Jobbeginn mit security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH". KEYCHAIN_PATH ist die einzige Quelle der Wahrheit; reichen Sie ihn an xcodebuild über OTHER_CODE_SIGN_FLAGS=--keychain "$KEYCHAIN_PATH" oder die gleichwertige Projekteinstellung weiter. Vermischen Sie Developer-ID- und Apple-Distribution-Identitäten im selben Bund nur, wenn Ihre ExportOptions.plist Team und Profil bereits eindeutig fixiert. Teams, die Runner über Landesgrenzen anbinden, sollten MTU- und DNS-Pfade nicht dem Bauchgefühl überlassen—hier lohnt ein Abgleich mit WireGuard und Gateway-Kopplung bei grenzüberschreitender Fernsteuerung: Fehlerbehebung zu MTU, asymmetrischem Routing, DNS-Splitting und Latenzbeobachtung (Cloud-Mac-Region und Spezifikationswahl), sobald Artefakte oder Logs über VPN ziehen.
2. codesign-Schichten: Berechtigungen, Hardened Runtime und verschachtelte Bundles
Reproduzierbare Signatur heißt: dieselbe Entitlements-Plist und derselbe Provisioning-Profile-Fingerprint in jedem Lauf. Nach dem Export codesign --verify --deep --strict auf dem App-Bundle ausführen und für Helfer in PlugIns oder Frameworks jeweils Team-ID und Hardened-Runtime-Flags prüfen. Diskrepanzen zeigen sich oft erst bei productbuild oder notarytool als errSecInternalComponent oder errSecMissingEntitlement, obwohl die Haupt-App zuvor „grün“ wirkte. Bei .pkg von innen nach außen signieren, danach das Paket mit dem im Runbook dokumentierten Installer-Zertifikat.
3. Notarization und stapler: strikte Reihenfolge
notarytool mit App-Store-Connect-API-Key (Issuer, Key-ID, Pfad zur .p8)—Pfade per Umgebung injizieren, nichts ins Repository committen; Transporter-only-Flows nur bei harten Vorgaben. Reichen Sie genau die Binärdatei ein, die Gatekeeper später prüft—typisch Zip, .app oder notarisierungsfertige .dmg—und warten Sie auf Accepted, bevor Sie staplen. Anschließend xcrun stapler staple <Pfad> und mit stapler validate prüfen. Wer stapelt, bevor Apple grün meldet, oder nur ein inneres .app stapelt, während ein äußeres Archiv neu komprimiert wird, erzeugt für Kundinnen andere Hashes als der Notary-Dienst. API-Key-Rotation und Submission-IDs im Änderungslog festhalten; bei Ablehnung notarytool log <submission-id> ziehen und die erste fehlschlagende Regel-ID ans Ticket hängen.
4. Pipeline-Checkliste (minimal)
- CI-Schlüsselbund entsperren; Identitäten per
security find-identityverifizieren. - Derived Data bei Profil-Zombies leeren; sonst inkrementell mit fixierten Abhängigkeitsversionen bauen.
- Mit fixierter
ExportOptions.plistarchivieren und exportieren; dSYM-Upload getrennt von der Notarisierung planen. - Bei Apple einreichen; bis
Acceptedpollen; staplen; validieren; Prüfsummen neben Artefakten veröffentlichen.
Containerisierte Build-Helfer auf demselben Host brauchen korrekte Volume-Mounts und SSD-Reserve—kombinieren Sie diese Liste mit Produktions-Docker auf Apple-Silicon-Cloud-Mac: arm64/amd64-Images, Bind-Mounts & Build-Cache — Fehlerbehebungs-Handbuch (mit Tarif-Grenzen), wenn Docker und Xcode eine Maschine teilen.
5. Symptom–Ursache–Maßnahme (Signatur & Notarisierung)
| Symptom / Log-Ausschnitt | Wahrscheinliche Ursache | Bevorzugte Maßnahme |
|---|---|---|
errSecInternalComponent beim Signieren |
Privater Schlüssel im CI-Schlüsselbund nicht nutzbar; ACL oder Passwort falsch | Schlüssel+Zertifikat neu importieren; Schlüsselbund im Job entsperren; explizites --keychain |
No signing certificate found |
Falsche Schlüsselbund-Suchliste oder fehlendes Provisioning-Profil | CODE_SIGN_KEYCHAIN setzen; Profil-UUID unter ~/Library/MobileDevice/Provisioning Profiles prüfen |
Notarisierung Invalid mit Hardened Runtime |
Entitlement für Distribution unzulässig; nicht signiertes verschachteltes Helper-Binary | Entitlements mit Apple-Dokumentation vergleichen; verschachtelte Bundles deep-verifizieren |
| Gatekeeper quarantäniert trotz CI-„Erfolg“ | Stapler nicht auf dem ausgelieferten Artefakt; Zip nach Stapling neu gepackt | Äußerstes Lieferobjekt staplen; validieren; nach Stapling nicht neu verpacken |
notarytool-Authentifizierungsfehler |
Falscher Issuer/Key-ID; Uhrzeit driftet; widerrufener API-Key | Key rotieren; NTP; JSON-Key außerhalb des Repositorys lagern |
6. Fazit
Behandeln Sie Signatur, Notarisierung und Stapling als eine Zustandsmaschine: die Ausgabe von Schritt n ist die Eingabe von Schritt n+1. Schlüsselbundpfad, Profil-UUIDs und Notary-Submission-IDs gehören in denselben Runbook-Eintrag, damit die nächste Person im Bereitschaftsdienst nicht raten muss, welche Identität aktiv war. Wenn die Kette steht, einmal einen Kaltstart-Build auf frischem Runner-Image fahren und belegen, dass Neustarts und Credential-Rotation überlebt werden.
Warum Cloud-Mac mini zu signaturlastiger CI passt
Apple Silicon liefert native arm64-Toolchains ohne Emulator-Fallen, und Unified Memory hält Xcode, Simulatoren und leichte Agenten in einem vorhersagbaren Pool. macOS bündelt Gatekeeper, SIP und FileVault-ähnliche Schutzmechanismen, die das Manipulationsrisiko gegenüber improvisierten Windows-Build-VMs senken, während M-Serie-Mac-mini-Leerlaufstrom für 24/7-Runner niedrig bleibt. Dedizierte Cloud-Macs vermeiden Noisy-Neighbor-Konkurrenz bei Signatur-Durchsatz und Platten-I/O—genau dort, wo geteilte SaaS-Warteschlangen weh tun—und das kompakte Gehäuse hält die Gesamtkosten im Vergleich zu Laptop-Flotten als Ad-hoc-CI im Rahmen.
Wenn Sie stabile, Apple-native Hardware für reproduzierbare Signatur-Pipelines wollen, ist kvmboot Cloud Mac mini M4 ein pragmatischer Einstieg—Tarife und Preise ansehen und das Schlüsselbund-Layout mit den gebuchten Tarifen abstimmen.