Entwicklerteam vergleicht Effizienzmetriken von GitHub Actions und selbstgehosteten Mac-CI-Knoten

Auf dem Migrations-Review fragt die Fuehrungsebene nur eines: „Wenn wir von GitHub Actions auf selbstgehostete Mac-Knoten wechseln — wie viel Entwicklungseffizienz gewinnen wir wirklich?“ Antworten wie „der Build ist etwas schneller“ reichen selten. 2026 haben wir mit mehreren iOS-, Flutter- und React-Native-Teams A/B-Vergleiche gefahren: Nach dem Umzug auf Self-hosted Mac-Knoten (Buero-Mac mini, Bare Metal oder Cloud Mac mit Runner) liegt der groesste Gewinn selten im Compiler, sondern in Queue und Wartezeit nahe null. Vier Metrik-Typen, drei reale Team-Tabellen und eine zweiwöchige Migrations-Checkliste beantworten „wie viel“ — plus ROI-Grobrechnung.

Datenbasis: Zahlen aus anonymisierten Migrationen Q4 2025–Q2 2026 (Teams 8–35 Personen, Swift / Kotlin Multiplatform / RN). Hardware ueberwiegend M4 16 GB und M4 Pro 24 GB. Eigene Repo-Groesse einsetzen — Stand 2026-07-20.

Quick Answer: Wie viel Effizienz?

Was Sie interessiertHosted macOS Runner (vorher)Selbstgehosteter Mac-Knoten (nachher)Typische Verbesserung
PR bis gruener Haken (End-to-End)42–68 Min.9–16 Min.ca. 70–80 % kuerzer
Queue-Wartezeit15–45 Min./Lauf0–2 Min.nahezu null
Einzelnes Archive-Build11–14 Min.8–11 Min.ca. 15–25 % (mit Cache)
TestFlight-Builds pro Release-Nacht1–23–5Durchsatz ca. 2–3×
Passive Wartezeit/Woche/Entwickler3–6 Personenstunden0,5–1,2 Personenstundenca. 75 % weniger

Kurz gesagt: Der Hauptgewinn ist Warten, nicht „schnellerer Compiler“. Eigene Knoten nehmen den knappen macOS-Pool aus der Shared Queue — plus persistierte DerivedData entstehen die Groessenordnungen oben.

Erst messen, dann über „wie viel“ sprechen

Viele Teams sagen nach der Migration „kaum schneller“, weil sie nur Job duration in GitHub Actions sehen und queue time sowie Slack-Wartezeit ignorieren. Zwei Wochen vor und nach der Migration — mindestens vier Kennzahlen:

  • Queue-Wartezeit: Sekunden von job queued bis job started, P50 / P95
  • PR-Feedback-Loop: Letzter Push bis alle required checks gruen
  • Release-Fenster-Durchsatz: Erfolgreiche TestFlight-Uploads in festem 4-Stunden-Fenster
  • Passive Warte-Personenstunden: Umfrage oder PR-Zeitstempel

Export: GitHub API run_started_at minus created_at; oder Workflow-Step, der Queue-Sekunden ins Artifact schreibt. Ohne Baseline ist ROI gegenueber dem Management schwer belegbar.

MetrikErfassungErfolgssignal nach Migration
Queue P95Actions API / eigener Stepvon >20 Min. auf <3 Min.
PR-Feedback P50PR-Ereignis-Zeitstempel>50 % Reduktion
Cache-TrefferquoteDerivedData-Groesse + Build-Logvon <20 % auf >60 %
Parallel-FehlerrateFehlschlag bei mehreren Jobs auf einem Hostnach Verzeichnis-Isolation <2 %

Drei Team-Vergleiche: vorher vs. nachher

Alle drei Datensaetze aus echten Migrationen (anonymisiert), gleiches Repo, gleiche Xcode-Hauptversion, je zwei Wochen Werktage.

Fall A: 12-koepfiges iOS-Team, eine App + Extensions

Vorher alles auf macos-14; nachher 2× M4 16 GB Cloud Mac als Self-hosted Runner, DerivedData auf lokalem NVMe. Ca. 18 PRs/Tag.

MetrikVorherNachherDelta
PR-Feedback P5052 Min.11 Min.−79 %
Queue P9538 Min.0,8 Min.−98 %
Archive einmalig12,4 Min.9,1 Min.−27 %
TestFlight-Builds/Nacht1,54+167 %

Tech Lead wortwoertlich: „Frueher Push um 17 Uhr, Merge-Freigabe um halb sieben — jetzt kurz Wasser holen, PR ist gruen.“

Fall B: 28 Personen KMP + Android-Hauptrepo, Mac nur fuer iOS-Shell

Vorher macOS- und Android-Jobs im gleichen Release-Fenster; nachher 1× dauerhafter M4 Pro plus 2× Burst-Cloud-Macs in Release-Wochen (siehe Release-Burst-Playbook).

MetrikVorherNachherDelta
Dual-Platform PR gruen P5071 Min.24 Min.−66 %
Queue gesamt/Tag in Release-Woche6,2 Std.0,4 Std.−94 %
Wartezeit/Woche (Umfrage)4,8 Personenstunden1,1 Personenstunden−77 %

Fall C: 8 Personen Indie, 2 Releases/Monat

Gegenbeispiel: kaum Verbesserung — wenige PRs, keine Queue, dafuer Keychain-Pflege auf eigener Maschine. Archive nur 10,2 → 9,4 Min. (−8 %), Queue war ohnehin ~0. „Wie viel“ haengt stark von der Last ab.

Tabellen lesen: Bei A/B kommen ca. 60–75 % aus verschwundener Queue, 15–25 % aus persistiertem DerivedData / SwiftPM, Rest aus Parallel-Maschinen. Nur Runner tauschen ohne Cache halbiert den Gewinn.

Woher der Gewinn kommt: Queue, Cache, Parallelitaet

Gesamtwartezeit zerlegen — das hilft auch nicht-technischen Stakeholdern:

PR-Gesamtzeit ≈ Queue + Umgebung + Build/Test + Upload

1. Queue (groesster Block): GitHubs macOS-Pool ist geteilt; in Release- oder Xcode-Upgrade-Wochen P95 30+ Min. ist normal. Eigener Knoten = dedizierter Executor, Queue faellt fast weg.

2. Cold Start und Cache: Hosted Jobs werden zerstoert — DerivedData, Pods, SwiftPM jedes Mal neu. Persistente Volumes auf eigenen Maschinen: zweiter Build oft ~20 % schneller; Details in Self-hosted Runner Cache & Disk FAQ.

3. Parallelitaet: 2–3 Macs fuer Matrix-Jobs — Release-Nacht nicht mehr „eine Kette“. Pro Host Verzeichnis-Isolation, sonst frisst Flakiness den Gewinn.

PhaseHosted Runner typischNach eigene Knoten
Queue45–70 %<5 %
Deps entpacken / Index15–25 %5–10 % (persistenter Cache)
Reines Build/Test20–35 %15–30 %

Zweiwöchiger Migrationspfad: erst vergleichen, dann Traffic

Freitagabend alles umstellen — ungerne. Reproduzierbarer Ablauf:

  • Tag 1–2: Zwei Wochen Queue/duration aus Actions exportieren; 1× Cloud Mac (~5 Min.), Runner, runs-on: [self-hosted, macos, canary] nur manuell
  • Tag 3–5: ~/ci/DerivedData und SwiftPM persistieren; gleicher main-Commit A/B je 5×, P50 notieren
  • Tag 6–8: Release/nightly 50 % auf self-hosted Label; hosted als Fallback
  • Tag 9–10: PR required checks voll auf self-hosted; Disk 80 %-Schwelle und Artifact-Cleanup-Cron
  • Tag 11–14: Vergleichstabelle, ROI an Management; entscheiden: 1× dauerhaft oder Burst mieten

Orchestrierung bleibt GitHub Actions — YAML, Permissions, Environment Protection unveraendert, nur runs-on. Gleiche Idee wie Enterprise Mac CI Ressourcenpool: Orchestrierung und Ausfuehrung trennen.

Minimale Workflow-Aenderung

jobs:
  ios-build:
    # Vorher: runs-on: macos-14
  ios-build:
    runs-on: [self-hosted, macos, ios-pool]
    steps:
      - uses: actions/checkout@v4
      - name: Log queue metrics
        run: echo "QUEUE_SEC=${QUEUE_SEC:-0}" >> $GITHUB_STEP_SUMMARY

Noch unsicher wegen Hardware? M4 Cloud Mac tageweise mieten fuer zwei Wochen Vergleich — oft guenstiger als eine Stunde Wartezeit fuers ganze Team.

ROI-Grobrechnung: Deckt Effizienz die Maschine?

Mit Fall A (Stundensatz blended $55, nur Illustration):

  • 12 Personen × 3,7 Std. weniger Warten/Woche ≈ 44 Personenstunden/Monat$2.420/Monat aequivalenter Output
  • 2× M4 16 GB Cloud Mac ≈ $206/Monat ($103/Maschine × 2, laut Preisseite)
  • Plattform-Ops nebenbei ≈ 4–8 Personenstunden/Monat (Disk, Zertifikate, Runner-Upgrade)

Netto oft positiv — kleine Teams mit wenig Builds (Fall C) rechnet es sich evtl. nicht. Eigene Queue P95 einsetzen:

Monatsgewinn ≈ Entwickler × weniger Warte-Std./Woche × 4 × Stundensatz − Maschinenmiete − Ops-Std. × Stundensatz

In Release-Wochen dritte Maschine als Burst, in Flachphase zurueckgeben. Langfrist TCO Kauf vs. Miete: Mac mini kaufen oder Cloud Mac mieten.

Wann lieber nicht migrieren

In diesen Faellen rate ich erst abwarten oder nur eine Woche validieren:

  • <30 macOS Jobs/Monat und Queue P95 dauerhaft <5 Min. — niedrige Decke (Fall C)
  • Niemand pflegt Runner on-call — volle Disk nervt mehr als Queue
  • Compliance: Maschine muss in eigener VPC — Netzwerk und Secrets zuerst
  • Erwartung „ohne GitHub Actions“ — Orchestrierung, Audit, Permissions bleiben wertvoll

Migration ist Mittel; Ziel ist . Schafft der Zweiwochen-Vergleich keine >30 % PR-Feedback-Verbesserung, zuerst Workflow optimieren (Jobs splitten, Archive seltener) — nicht drei Macs kaufen.

FAQ

Wie viel Effizienz gewinnt man typischerweise?

Bei haeufigen iOS-Builds oft ~70 % kuerzeres PR-Feedback und Queue nahe null; reines Compile +15–25 %. Seltene Builds: oft nur einstellige Prozent — Baseline zuerst.

Reicht ein Mac?

Fuer <10 Personen und serielle Releases meist ja; bei Matrix oder mehreren Apps 2× empfohlen, mit Concurrency-Limit gegen Cache-Kollision.

Senkt sich die Actions-Rechnung?

macOS-Minuten oft 60–90 % weniger (je nach migrierten Jobs); dafuer Miete und Ops. Gesamtrechnung mit ROI-Formel oben.

Cloud Mac vs. Buero-Mac mini?

Gleicher Chip/RAM: aehnliche Compile-Zeit. Unterschied: Netzwerk-RTT (Deps, Upload) und NVMe-Disk. Knoten nahe Code-Hosting und Artifact-Registry waehlen.

Signing und Notarisierung?

Werden nicht automatisch besser — aber stabile Umgebung reduziert Keychain- und Provisioning-Drift und „nur in CI“-Nacht-Feuer.

Wie schnell sieht man Effekt?

Runner + Cache-Verzeichnis aktiv: erster Werktag sichtbar in Queue-Metriken; PR-Loop zwei Wochen messen vor Reporting.

Fazit und weiterführende Links

Migration von GitHub Actions zu selbstgehosteten Mac-Knoten: Die Antwort ist nicht vage „viel schneller“. Typische iOS-Teams sehen ~70 % kuerzeres PR-Feedback und doppelten Release-Durchsatz — Hauptanteil Queue weg, dann persistenter Cache. Zweiwochen-Vergleich, vier Metriken, ROI-Formel liefern Zahlen fuer das Management; ohne klaren Effekt zuerst Workflow, nicht Hardware.