runnerhut
Leitfäden
Lösungen für die CI-Probleme, die Teams tatsächlich treffen.
Geschwindigkeit13
So beschleunigen Sie GitHub ActionsIhre Pipeline braucht länger, als irgendjemand warten möchte, und es ist nicht klar, wo die Zeit vergeht.So finden Sie den langsamen Schritt in einem WorkflowDie Pipeline ist langsam, aber jeder einzelne Schritt sieht vernünftig aus.So reduzieren Sie GitHub Actions KaltstartsJobs ruhen 30 bis 90 Sekunden, bevor der erste Schritt ausgeführt wird.So diagnostizieren Sie GitHub Actions WarteschlangenzeitenAufträge stehen minutenlang in der Warteschlange, bevor ein Läufer sie abholt.So beschleunigen Sie den Git-CheckoutAktionen/Auschecken dauern bei einem großen Repository nur wenige Minuten.So führen Sie CI in einem sehr großen Repository ausCheckout, Indizierung und Statusberichte verschlechtern sich, wenn das Repository wächst.So beschleunigen Sie Git LFS-CheckoutsLFS-Objekte werden seriell heruntergeladen und dominieren die Checkout-Zeit.So vermeiden Sie Leerlaufzeiten am ArbeitsplatzJobs verbringen ihre Zeit damit, nichts zu tun – auf einen Dienst, einen Ruhezustand oder eine Umfrageschleife zu warten.Umgang mit lang andauernden JobsEinige Jobs laufen stundenlang und erreichen gelegentlich die Sechs-Stunden-Grenze.So führen Sie nächtliche Builds effizient ausNächtliche Builds sind teuer und niemand liest die Ergebnisse.So stoppen Sie CI-WiederholungsstürmeEntwickler führen fehlerhafte Jobs wiederholt aus, was die Kosten vervielfacht und echte Fehler verbirgt.So teilen Sie Tests über eine Matrix hinweg aufEin langer Testauftrag dominiert die Pipeline.So führen Sie nur die von einer Änderung betroffenen Tests ausBei jedem Push wird die gesamte Testsuite ausgeführt, unabhängig davon, was sich geändert hat.
Kosten13
So reduzieren Sie die Kosten für GitHub ActionsDie CI-Rechnung wächst schneller als das Team und niemand weiß genau, warum.So messen Sie die CI-Kosten pro Pull-AnfrageSie kennen die monatliche Gesamtsumme, aber nicht, was eine einzelne Pull-Anfrage kostet.So weisen Sie Teams CI-Kosten zuCI-Ausgaben sind eine Zeile auf der Rechnung und kein Team fühlt sich dafür verantwortlich.So legen Sie ein CI-Minutenbudget festDie Ausgaben werden am Ende des Monats ermittelt und nicht während des Monats kontrolliert.Wenn größere Läufer tatsächlich Geld sparenEin größerer Läufer kostet mehr pro Minute, daher ist unklar, ob er insgesamt günstiger ist.So senken Sie die Kosten für macOS-RunnermacOS dominiert die CI-Rechnung.So reduzieren Sie die Kosten für CI-AusgangDer Datentransfer macht einen großen und wachsenden Anteil der BYOC-Rechnung aus.So reduzieren Sie die ECR-Pull-KostenContainer-Image-Pulls verursachen erhebliche Datenübertragungsgebühren.So reduzieren Sie die S3-Übertragungskosten in CICache- und Artefaktverkehr zu S3 ist teuer.Die tatsächlichen Kosten selbst gehosteter LäuferSelbst gehostete Läufer sind neben der minutengenauen Abrechnung kostenlos.So verwenden Sie Spot-Instanzen für CI-LäuferOn-Demand-Instanzen sind für Workloads, die von Natur aus wiederholbar sind, teuer.So passen Sie Ihre Läufer richtig anLäufergrößen wurden einmal ausgewählt und nie wieder überprüft.Wie man CI wirtschaftlich auf Open Source betreibtOpen-Source-CI ist auf GitHub-gehosteten Läufern kostenlos, aber langsam, und Selbsthosting ist unsicher.
Caching16
So sorgen Sie dafür, dass CI-Caches tatsächlich bestehen bleibenCaches sind konfiguriert, aber die Trefferquote ist niedrig.So umgehen Sie das 10-GB-Cache-LimitIhre Caches überschreiten 10 GB pro Repository und beginnen mit der stillschweigenden Räumung.So teilen Sie einen Build-Cache über mehrere Repositorys hinwegJedes Repository verwaltet seinen eigenen Cache für dieselben gemeinsam genutzten Abhängigkeiten.So teilen Sie einen Docker-Cache zwischen JobsJedes Matrixbein baut die gleichen Schichten wieder auf.So beheben Sie die Docker-Cache-UngültigmachungDocker-Layer werden auch dann neu erstellt, wenn sich die relevanten Dateien nicht geändert haben.So schreiben Sie einen Cache-Schlüssel, der trifftDer Cache ist konfiguriert, schlägt jedoch bei jedem Lauf fehl.So verwenden Sie Ccache in GitHub ActionsC- und C++-Builds kompilieren bei jedem Durchlauf alles neu.So verwenden Sie Sccache für Rust-BuildsCargo erstellt Abhängigkeiten neu, wenn der Zielverzeichnis-Cache fehlt.So aktivieren Sie den Gradle-KonfigurationscacheGradle verbringt 30 bis 60 Sekunden mit der Konfiguration, bevor er etwas kompiliert.So zwischenspeichern Sie Toolchain-Managermise, asdf oder proto installieren die Sprachlaufzeiten bei jedem Lauf neu.So zwischenspeichern Sie NuGet-PaketeDotnet Restore lädt bei jedem Lauf die gleichen Pakete herunter.So zwischenspeichern Sie Jest-TransformationenJest transformiert jede Datei bei jedem Durchlauf neu.So zwischenspeichern Sie vcpkg- und Conan-PaketeC++-Abhängigkeitsmanager erstellen Pakete bei jeder Ausführung aus dem Quellcode neu.So zwischenspeichern Sie Xcode DerivedDataXcode erstellt das gesamte Projekt bei jedem CI-Lauf neu.Auswahl eines BuildX-Cache-BackendsEs gibt vier Cache-Backends und es ist unklar, welches verwendet werden soll.So halten Sie den Basis-Branch-Cache warmNeue Feature-Branches beginnen immer mit einem kalten Cache.
Docker12
So richten Sie Docker-Layer-Caching einDocker-Builds dauern zehn Minuten, da jede Ebene neu erstellt wird.So optimieren Sie eine Docker-Datei für CIKleine Codeänderungen lösen lange Neuerstellungen aus.So verwenden Sie mehrstufige Docker-BuildsDie Bilder sind groß und enthalten Build-Tools, die nicht versendet werden sollten.So führen Sie gleichzeitige Docker-Builds sicher ausParallele Matrixbeine konkurrieren und Gebäude werden langsamer oder scheitern.So verwenden Sie einen Remote-Docker-BuilderDer Layer-Cache wird bei jedem Build zum und vom Runner übertragen.So erstellen Sie schnell plattformübergreifende ImagesDurch das Hinzufügen von Linux/Arm64 dauert der Build zwanzig Minuten.So reduzieren Sie die ContainerbildgrößeBilder sind Hunderte von Megabyte groß und werden bei jedem Auftrag nur langsam abgerufen.So übergeben Sie Geheimnisse an einen Docker-BuildWährend des Builds benötigen Sie ein privates Registrierungstoken oder einen SSH-Schlüssel.So konfigurieren Sie Docker-Builder-ProfileUnterschiedliche Bilder erfordern unterschiedliche Builder-Ressourcen.So erstellen Sie viele Bilder aus einem MonorepoBei jedem Push wird jedes Bild im Repository erstellt.So veröffentlichen Sie in mehreren RegisternDas gleiche Image wird einmal pro Registrierung erstellt.So richten Sie einen Pull-Through-Cache für die Registrierung einImage-Pulls sind langsam und Sie stoßen ständig an die Geschwindigkeitsgrenzen des Docker-Hubs.
arm647
So verschieben Sie CI auf arm64-LäuferSie stellen Graviton oder Ampere bereit, bauen aber auf x64 auf.Checkliste für die Arm64-MigrationSie möchten zu arm64 wechseln, ohne die Pipeline zu unterbrechen.Cross-Kompilierung im Vergleich zu nativem arm64Sie benötigen arm64-Binärdateien und sind sich nicht sicher, ob Sie Cross-Compilieren oder nativ erstellen sollen.Warum QEMU arm64-Builds so langsam sindDas Hinzufügen von linux/arm64 zu einem Docker-Build macht ihn zwanzigmal langsamer.Node-native Module auf arm64 reparierenDie npm-Installation schlägt auf Arm64-Läufern fehl oder wird aus dem Quellcode kompiliert.Python-Räder am Arm64 befestigenpip install kompiliert Pakete aus dem Quellcode auf arm64.Aufbauend auf AWS Graviton-LäufernSie wollen den Preis-Leistungs-Vorteil von Graviton im CI nutzen.
macOS und iOS8
So verkürzen Sie die Xcode-Erstellungszeiten in CIXcode-Builds dauern bei jedem Lauf zwanzig Minuten.So beschleunigen Sie iOS-SimulatortestsSimulatortests dauern eine halbe Stunde.Umgang mit der iOS-Codesignatur in CIDas Signieren funktioniert lokal und schlägt in CI zeitweise fehl.So beglaubigen Sie macOS-Apps in CIDie Beglaubigung erfolgt langsam und es kommt gelegentlich zu Zeitüberschreitungen.Behebung der Erschöpfung der macOS-Runner-FestplatteUnter macOS schlagen Aufträge fehl, da auf dem Gerät kein Speicherplatz mehr vorhanden ist.So parallelisieren Sie iOS CIiOS CI ist seriell und macOS-Minuten sind teuer.So laden Sie von CI auf TestFlight hochTestFlight-Uploads sind langsam und schlagen manchmal nach einem erfolgreichen Build fehl.So pinnen Sie Xcode-VersionenEin Runner-Image-Update hat die Xcode-Version stillschweigend geändert und Ihr Build hat sich damit geändert.
Windows5
So machen Sie Windows CI schnellerWindows-Jobs dauern dreimal so lange wie entsprechende Linux-Jobs.So zwischenspeichern Sie die MSBuild-AusgabeBei jedem Build werden alle Projekte neu kompiliert.Installieren von Visual Studio-Komponenten in CIEin erforderlicher VS-Workload fehlt und die Installation dauert fünfzehn Minuten.So signieren Sie Windows-Binärdateien in CIFür die Authenticode-Signierung ist ein Zertifikat erforderlich, das nicht offengelegt werden darf.So parallelisieren Sie .NET-Tests.NET-Tests werden seriell ausgeführt und dauern zwanzig Minuten.
Sicherheit6
So verwalten Sie Geheimnisse in GitHub ActionsGeheimnisse sind über die Repository-Einstellungen verstreut und niemand weiß, was noch verwendet wird.So führen Sie CI-Läufer in Ihrer VPC ausBuilds müssen einen internen Dienst erreichen, der nicht öffentlich verfügbar ist.So geben Sie Läufern eine statische IPEin Drittanbieterdienst erfordert eine IP-Zulassungsliste und gehostete Läufer-IPs ändern sich ständig.So führen Sie Sicherheitsscans durch, ohne CI zu verlangsamenDas Scannen von Sicherheitslücken fügt jedem Pull-Request Minuten hinzu.So sichern Sie Ihre CI-LieferketteAktionen von Drittanbietern werden mit Zugriff auf Ihr Repository und Ihre Geheimnisse ausgeführt.So härten Sie Workflow-Berechtigungen ausJeder Workflow läuft mit Schreibzugriff, den er nicht benötigt.
Beobachtbarkeit10
So sammeln Sie LäufermetrikenSie können nicht erkennen, ob ein Job CPU-gebunden, speichergebunden oder festplattengebunden ist.So verfolgen Sie Perzentile für die Build-DauerDie durchschnittliche Bauzeit sieht gut aus, aber die Entwickler beschweren sich immer noch.So exportieren Sie CI-Traces mit OpenTelemetryCI-Timing-Daten befinden sich in einem vom Rest Ihrer Observability getrennten Tool.So fragen Sie CI-Daten programmgesteuert abSie benötigen CI-Daten in einem Dashboard oder einem wöchentlichen Bericht.So erstellen Sie einen wöchentlichen CI-GesundheitsberichtCI verschlechtert sich allmählich und niemand bemerkt es, bis es schlecht ist.So warnen Sie vor CI-RegressionenEine Änderung verlangsamt CI um 40 % und bleibt wochenlang unbemerkt.Wie man mit instabilen CI-Jobs umgehtTests schlagen nach dem Zufallsprinzip fehl und die Leute versuchen es erneut, bis sie bestehen.So debuggen Sie einen fehlgeschlagenen WorkflowEin Job schlägt in CI fehl und funktioniert überall anders.So legen Sie CI-Servicelevel festNiemand ist sich darüber einig, wie schnell CI sein sollte, daher wird ihr nie Priorität eingeräumt.So stellen Sie CI-Daten KI-Agenten zur VerfügungAgenten, die CI-Fehler debuggen, können nur mit Protokolltext arbeiten.
Maßstab28
So skalieren Sie selbst gehostete LäuferSelbst gehostete Läufer stehen entweder zu Spitzenzeiten in der Warteschlange oder bleiben untätig und teuer.So verwenden Sie LäufergruppenJedes Repository kann Jobs auf jedem Runner planen.So entwerfen Sie eine Läufer-Label-StrategieDie Etiketten sind organisch gewachsen und niemand weiß, welche sie verwenden sollen.Gehostet oder BYOC: So wählen Sie ausSie sind sich nicht sicher, ob Sie gehostete Läufer verwenden oder in Ihrer eigenen Cloud bereitstellen sollen.So nutzen Sie wiederverwendbare Workflows im großen MaßstabFünfzig Repositories enthalten fünfzig leicht unterschiedliche Kopien derselben Pipeline.So koordinieren Sie Workflows über Repositorys hinwegEine Änderung in einem Repository muss Builds in anderen auslösen.So erstellen Sie benutzerdefinierte LäuferbilderBei jedem Auftrag werden Minuten damit verbracht, die gleichen Tools zu installieren.So führen Sie Basis-Image-Updates sicher durchEin Basis-Image-Update unterbricht Builds in vielen Repositorys gleichzeitig.Umgang mit der Abhängigkeits-Bot-CI-LastDependabot öffnet dreißig Pull-Requests und CI-Kostenspitzen.So arbeiten Sie mit ParallelitätsbeschränkungenJobs stehen in der Warteschlange und es ist nicht klar, welches Limit bindend ist.So nutzen Sie Container-Jobs effektivContainerjobs sorgen für Reproduzierbarkeit, unterbrechen jedoch das Caching.So verwenden Sie Servicecontainer richtigTests schlagen beim Start zeitweise fehl.So erstellen Sie einmal und stellen es mehrmals bereitDas gleiche Artefakt wird für jede Umgebung neu erstellt.So strukturieren Sie BereitstellungsjobsBereitstellungen sind langsam, riskant und schwer zu prüfen.So führen Sie Vorschauumgebungen effizient ausJede Pull-Anfrage wartet auf einen vollständigen Umgebungsbuild.So strukturieren Sie Release-BuildsRelease-Builds sind langsam und gelegentlich nicht reproduzierbar.So veröffentlichen Sie Build-ArtefakteDie Kosten für die Artefaktspeicherung steigen und die Aufbewahrung wurde nie konfiguriert.Umgang mit großen Artefakt-UploadsDas Hochladen der Build-Ausgabe dauert Minuten.So erhalten Sie inkrementelle Builds in CICI führt immer einen sauberen Build durch, auch wenn Ihr Build-System die inkrementelle Kompilierung unterstützt.So übergeben Sie Daten zwischen JobsJobs müssen Build-Ausgaben teilen und es ist unklar, wie.Wie man Matrix-Builds gut nutztDie Matrix ist gewachsen und niemand erinnert sich, warum jede Kombination existiert.So steuern Sie die MatrixexplosionEine kleine Matrixänderung verdreifachte die Anzahl der Aufträge und die Rechnung.So legen Sie die Größe von Runnern für Java-Builds festSie vermuten eine Läufergröße für einen Maven- oder Gradle-Build.So dimensionieren Sie Runner für Node-TestsuitenDie Jest- oder Vitest-Arbeiter sind entweder am Verhungern oder am Prügeln, und Sie sind sich nicht sicher, welches.So dimensionieren Sie Runner für Python-TestsuitenPytest läuft auf einem Kern, während der Läufer acht im Leerlauf hat.Wie man Läufer für Rust-Builds dimensioniertCargo baut mit Kernen auf, aber es ist unklar, wie weit das geht.Wie man Läufer für Docker-Builds dimensioniertSie wählen eine Läufergröße für Image-Builds.So bestimmen Sie die Größe von Runnern für Android-BuildsGradle-Montagen und Instrumentierungstests erfordern sehr unterschiedliche Maschinen.