Zum Inhalt springen

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.

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.