2026-04-20 Deterministische Ruby-Bundler- und CocoaPods-CI auf gemietetem Apple-Silicon-Cloud-Mac
Teams, die Mac mini M4- oder Mac Studio-Builder per SSH für iOS-CI mieten, betreiben weiter viele CocoaPods-Codebasen. Das Versagen ist nie „Pods sind schlecht“, sondern nicht-deterministische Ruby-Toolchains: ein Job nutzt das System-pod, ein anderer ein Homebrew-Upgrade vom Dienstag, ein dritter, was gem install cocoapods in ~/.gem hinterlassen hat. Dieses Runbook vom 2026-04-20 standardisiert Bundler-verwaltetes CocoaPods auf gemieteten Apple-Silicon-Hosts in HK / JP / KR / SG / US, richtet Cache-Verzeichnisse an Job-Workspaces aus und hält NVMe auf Multi-Tenant-Maschinen planbar. Querlesen: SwiftPM vs CocoaPods, nur CLT vs vollständiges Xcode und parallele xcodebuild-Jobs, damit Abhängigkeitsauflösung und Compile-Schritte synchron bleiben.
Warum Bundler auf Headless-Buildern weiterhin wichtig ist
CocoaPods ist ein Ruby-Programm. Die Stabilität des aufgerufenen pod-Binaries hängt vom Gem-Set dahinter ab. Bundler pinnt dieses Set über Gemfile.lock — genau das, was Sie brauchen, wenn zwölf Produktteams eine Cloud-Mac-Flotte teilen. Ohne Bundler bedeutet „grün auf meinem Branch“ oft „wer zuletzt eingeloggt war, hat CocoaPods global aktualisiert“.
- Reproduzierbarkeit — gleiches
Gemfile.lock→ gleiches Resolver-Verhalten über Regionen. - Prüfbarkeit — Security kann Gem-Versionen zwischen Releases vergleichen.
- Isolation —
bundle install --path vendor/bundlehält Gems im Workspace, nicht in geteilten Home-Verzeichnissen.
Ruby-Toolchain-Matrix (3.1 vs 3.2 vs 3.3)
Apple-Silicon-macOS-Images liefern oft ein aktuelles System-Ruby; manche Teams ergänzen rbenv oder asdf. Wählen Sie eine Policy pro Flotte und kodieren Sie sie im Infra-Repo. Dokumentieren Sie exakt ruby -v neben xcodebuild -version in den Build-Metadaten.
| Ansatz | Vorteile | Risiken |
|---|---|---|
| System-Ruby + Bundler | Schneller Bootstrap auf frischen SSH-Hosts | OS-Upgrades können Ruby anheben; mit plist oder CI-Env pinnen |
| rbenv pro Benutzer | Exakte Patch-Level | launchd-Jobs müssen rbenv-Shims explizit sourcen |
| asdf mit .tool-versions | Eine Datei für Ruby, Node und mehr | Längere Erstlaufzeit |
Gemfile- und Lockfile-Disziplin
Committen Sie Gemfile und Gemfile.lock. Pinnen Sie cocoapods auf einen bewährten Minor und listen Sie Plugins (z. B. cocoapods-acknowledgements) explizit — verlassen Sie sich nicht auf „was der neueste Plugin-Resolver ergibt“. Für CI empfehlen wir:
bundle config set --local deployment 'true'
bundle config set --local path 'vendor/bundle'
bundle install --jobs 4 --retry 3
bundle check vor pod install aus, um schnell zu scheitern, wenn jemand Gemfile.lock nach Gemfile-Änderung vergessen hat.
bundle exec pod install (und wann --deployment)
Rufen Sie immer bundle exec pod install auf (oder bundle exec pod install --deployment, wenn Bundler das Lockfile strikt durchsetzen soll). Rufen Sie in Produktionspipelines kein nacktes pod auf, es sei denn, Sie mögen Freitagabend-Nichtdeterminismus. Für CI-Caches übergeben Sie ein deterministisches CP_HOME_DIR oder empfohlene CocoaPods-Cache-Env-Vars unter dem Job-Verzeichnis.
~/Library/Caches/CocoaPods, können Teil-Downloads entstehen — isolieren Sie pro $CI_JOB_ID oder Repo-Klon-Pfad.
Caches, Pods/ und Workspace-Layout
Halten Sie Pods/ und *.xcworkspace-Erzeugung im geklonten Repo-Pfad dieses Builds. Auf ephemeren Workspaces cachen Sie vendor/bundle und den CocoaPods-Specs-Cache zwischen Läufen nur, wenn Prüfsummen zu Gemfile.lock + Podfile.lock passen — sonst aggressiv invalidieren; veraltete Specs-Caches erzeugen obskure Resolver-Fehler, die wie Netzwerkprobleme wirken.
NVMe und Multi-Tenant-Hygiene
CocoaPods-Downloads können pro Install Hunderte Megabyte addieren; Monorepos mit mehreren Podfiles multiplizieren die Kosten. Auf geteilten 512 GB-Hosts kombinieren Sie Resolver-Läufe mit der Platten-Anleitung aus Simulator- und Archiv-Bereinigung. Überschreiten Sie routinemäßig 70 % Platte während Pod-Schritten, splitten Sie Lanes oder wechseln Sie über Preise auf 1 TB / 2 TB-Knoten statt endlos mitten in der Pipeline zu stutzen.
Regionale Builder: CDN und Latenz
Specs-CDN-Zugriff aus Singapur oder Tokyo ist meist exzellent, doch Firmen-Proxys oder TLS-Inspection erhöhen Retries. Setzen Sie Retry-Flags für bundle install und dokumentieren Sie Spiegel oder Cache-Proxy pro Region, damit HK und US East konsistent bleiben.
Verwandte Runbooks
Migrieren Sie Lanes zu SwiftPM, vergleichen Sie Cache-Größen und Lock-Semantik mit SwiftPM-Auflösung und Cache. Zur Signatur nach Pods: bestehende Auto/Manual-Signing-Artikel — Bundler ersetzt keine Provisioning Profiles.
FAQ: Bundler + CocoaPods auf Cloud-Macs
| Frage | Praktische Antwort |
|---|---|
| Homebrew-CocoaPods? | In CI vermeiden — Bundler-gesteuerte Gems, damit Upgrades per Code-Review laufen, nicht per Zufalls-Paket-Bump. |
| Bundler 2 vs 1? | Einen Major standardisieren; Mismatch zwischen Dev-Laptops und CI ist häufige „lokal geht“-Quelle. |
| Soll CI Pods/ committen? | Team-Policy — entweder vollständig für hermetische Builds oder jedes Mal neu erzeugen; kein Halb-Commit. |
Fazit: Behandeln Sie CocoaPods wie jede andere Compiler-Toolchain — Versionen pinnen, Caches begrenzen und auf geteilten SSH-Buildern immer bundle exec verwenden.
Dedizierte Apple-Silicon-CI-Macs mieten
SSH-first · HK · JP · KR · SG · US