runnerhut (løberhytte)
Guides
Løsninger på de CI-problemer teams reelt løber ind i.
Hastighed13
Sådan fremskyndes GitHub ActionsDin pipeline tager længere tid, end nogen ønsker at vente, og det er ikke indlysende, hvor tiden bliver af.Sådan finder du det langsomme trin i en arbejdsgangRørledningen er langsom, men hvert enkelt skridt ser fornuftigt ud.Sådan reduceres GitHub Actions koldstarterJobs sidder i 30 til 90 sekunder, før det første trin løber.Sådan diagnosticeres GitHub Actions køtiderJobs står i kø i minutter, før en løber samler dem op.Sådan gør du git checkout hurtigerehandlinger/checkout tager minutter på et stort lager.Sådan kører du CI på et meget stort lagerCheckout, indeksering og statusrapportering forringes alt sammen, efterhånden som lageret vokser.Sådan fremskyndes Git LFS-udbetalingerLFS-objekter downloades serielt og dominerer betalingstiden.Sådan fjerner du ledig tid i jobJobs bruger tid på at lave ingenting - venter på en service, en søvn eller en afstemningsløkke.Sådan håndterer du langvarige jobNogle job løber i timevis og rammer lejlighedsvis grænsen på seks timer.Hvordan man kører natlige builds effektivtNatlige byggerier er dyre, og ingen læser resultaterne.Sådan stopper du CI rerun stormeUdviklere kører fejlende job gentagne gange, multiplicerer omkostningerne og skjuler reelle fejl.Sådan sønderdeles tests på tværs af en matrixEt langt testjob dominerer pipelinen.Sådan kører du kun de test, der er påvirket af en ændringHvert tryk kører hele testpakken, uanset hvad der er ændret.
Omkostninger13
Sådan reduceres omkostningerne til GitHub ActionsCI regningen vokser hurtigere end holdet, og ingen ved hvorfor.Sådan måler du CI-omkostninger pr. pull-anmodningDu kender den månedlige total, men ikke hvad en enkelt pull-anmodning koster.Sådan tilskrives CI-omkostninger til holdCI-forbrug er én linje på fakturaen, og ingen hold føler sig ansvarlige for det.Sådan indstilles et CI-minutterbudgetUdgifter opdages i slutningen af måneden i stedet for at blive kontrolleret i løbet af den.Når større løbere rent faktisk sparer pengeEn større løber koster mere i minuttet, så det er uklart, om den samlet set er billigere.Sådan reducerer du omkostningerne til macOS runnermacOS dominerer CI-regningen.Sådan reduceres CI-udgangsomkostningerDataoverførsel er en stor og voksende del af BYOC-regningen.Sådan reduceres ECR pull-omkostningerContainer image pulls genererer betydelige dataoverførselsomkostninger.Sådan reduceres S3-overførselsomkostninger i CICache- og artefakttrafik til S3 er dyrt.De reelle omkostninger ved selvværtede løbereSelvværtede løbere ser gratis ud ved siden af fakturering pr. minut.Sådan bruger du spot-instanser til CI-løbereOn-demand-instanser er dyre for arbejdsbelastninger, der i sagens natur kan prøves igen.Sådan tilpasser du dine løbere i den rigtige størrelseLøberstørrelser blev valgt én gang og blev aldrig genbesøgt.Hvordan man kører CI økonomisk på open sourceOpen source CI er gratis på GitHub-hostede løbere, men langsom, og selvhosting er usikker.
Caching16
Sådan får du CI-caches til at fortsætteCaches er konfigureret, men hitfrekvensen er lav.Sådan omgås cachegrænsen på 10 GBDine caches overstiger 10 GB pr. lager og begynder stille at smide dem ud.Sådan deler du en build-cache på tværs af repositoriesHvert lager bevarer sin egen cache for de samme delte afhængigheder.Sådan deler du en Docker-cache mellem jobHvert matrixben genopbygger de samme lag.Sådan repareres Docker cache-ugyldiggørelseDocker lag genopbygges, selv når de relevante filer ikke blev ændret.Hvordan man skriver en cache-nøgle, der rammerCachen er konfigureret, men går glip af hver kørsel.Sådan bruger du ccache i GitHub ActionsC og C++ builds omkompilerer alt på hver kørsel.Sådan bruger du sccache til Rust buildsCargo genopbygger afhængigheder, når målkatalogcachen mangler.Sådan aktiverer du Gradle-konfigurationscachenGradle bruger 30 til 60 sekunder på at konfigurere, før han kompilerer noget.Sådan cachelagres værktøjskædeadministratorermise, asdf eller proto geninstaller sprogkørselstider ved hver kørsel.Sådan cachelagres NuGet-pakkerdotnet gendannelse downloader de samme pakker ved hver kørsel.Sådan cachelagres Jest-transformationerJest re-transformerer hver fil på hver kørsel.Sådan cachelagres vcpkg- og Conan-pakkerC++ afhængighedsadministratorer genopbygger pakker fra kilden ved hver kørsel.Sådan cachelagres Xcode DerivedDataXcode genopbygger hele projektet på hver CI-kørsel.Valg af en buildx-cache-backendDer er fire cache-backends, og det er uklart, hvilke der skal bruges.Sådan holder du basisgrencachen varmNye funktionsgrene starter altid med en kold cache.
Docker12
Sådan opsætter du Docker lagcacheDocker builds tager ti minutter, fordi hvert lag genopbygges.Sådan optimeres en Dockerfile til CISmå kodeændringer udløser lange genopbygninger.Sådan bruger du flertrins Docker buildsBilleder er store og indeholder byggeværktøjer, der ikke bør sendes.Sådan kører du samtidig Docker builds sikkertParallelle matrixben kæmper og opbygger langsommere eller fejler.Sådan bruger du en ekstern Docker builderLagcachen overføres til og fra løberen på hver build.Hvordan man hurtigt bygger multi-platform billederTilføjelse af linux/arm64 gør, at opbygningen tager tyve minutter.Sådan reduceres størrelsen på containerbilledetBilleder er hundredvis af megabyte og langsomme til at trække i hver opgave.Sådan overfører du hemmeligheder til en Docker-bygningDu skal bruge et privat registreringstoken eller SSH-nøgle under opbygningen.Sådan konfigureres Docker builder-profilerForskellige billeder har brug for forskellige builderressourcer.Hvordan man bygger mange billeder fra en monorepoHvert tryk bygger hvert billede i lageret.Sådan publiceres til flere registreDet samme billede bygges én gang pr. registreringsdatabasen.Sådan opsætter du en registry pull-through cacheBilledtræk er langsomt, og du bliver ved med at ramme Docker Hub-hastighedsgrænser.
arm 647
Sådan flyttes CI til arm64 løbereDu implementerer til Graviton eller Ampere, men bygger på x64.arm64 migration checklisteDu vil flytte til arm64 uden at bryde pipelinen.Krydskompilering versus indfødt arm64Du har brug for arm64 binære filer og er usikker på, om du skal krydskompilere eller bygge native.Hvorfor QEMU arm64 builds er så langsommeTilføjelse af linux/arm64 til en Docker build gør den tyve gange langsommere.Fastsættelse af node native moduler på arm64npm-installation mislykkes eller kompilerer fra kilden på arm64-løbere.Fastgøring af Python-hjul på arm64pip install kompilerer pakker fra kilden på arm64.Bygger på AWS Graviton løbereDu vil have Graviton pris-ydelsesfordelen i CI.
macOS og iOS8
Sådan skærer du Xcode-byggetider i CIXcode builds tager tyve minutter på hver løbetur.Sådan fremskyndes iOS-simulatortestsSimulatortest tager en halv time.Sådan håndteres iOS-kodesignering i CISignering fungerer lokalt og fejler periodisk i CI.Sådan notariseres macOS-apps i CINotarisering er langsom og af og til timeout.Retter udmattelse af macOS runner diskOpgaver mislykkes uden plads tilbage på enheden på macOS.Sådan paralleliseres iOS CIiOS CI er seriel og macOS minutter er dyre.Sådan uploades til TestFlight fra CITestFlight-uploads er langsomme og mislykkes nogle gange efter en vellykket build.Sådan pinner du Xcode-versionerEn runner image-opdatering ændrede lydløst Xcode-versionen, og din build ændrede sig med den.
Windows5
Sådan gør du Windows CI hurtigereWindows-job tager tre gange så lang tid som de tilsvarende Linux-job.Sådan cachelagres MSBuild outputHver build omkompilerer alle projekter.Installation af Visual Studio-komponenter i CIDer mangler en påkrævet VS-arbejdsbelastning, og installationen tager femten minutter.Sådan signeres Windows-binære filer i CIAutentikodesignering kræver et certifikat, der ikke må afsløres.Sådan paralleliseres .NET-tests.NET-tests kører serielt og tager tyve minutter.
Sikkerhed6
Sådan administrerer du hemmeligheder i GitHub ActionsHemmeligheder er spredt ud over lagerindstillinger, og ingen ved, hvad der stadig bruges.Sådan kører du CI-løbere inde i din VPCBygninger skal nå ud til en intern service, der ikke er offentligt eksponeret.Sådan giver du løbere en statisk IPEn tredjepartstjeneste kræver IP-tilladelsesliste, og hostede runner-IP'er ændres konstant.Sådan kører du sikkerhedsscanninger uden at bremse CISårbarhedsscanning tilføjer minutter til hver pull-anmodning.Sådan sikrer du din CI-forsyningskædeTredjepartshandlinger kører med adgang til dit lager og hemmeligheder.Sådan hærder du workflow-tilladelserHver arbejdsgang kører med skriveadgang, den ikke behøver.
Observerbarhed10
Sådan indsamler du løbermetricsDu kan ikke se, om et job er CPU-bundet, hukommelsesbundet eller diskbundet.Sådan sporer du byggevarighedspercentilerGennemsnitlig byggetid ser fint ud, men udviklere klager stadig.Sådan eksporteres CI-spor med OpenTelemetryCI timing data lever i et separat værktøj fra resten af din observerbarhed.Sådan forespørges CI-data programmatiskDu har brug for CI-data i et dashboard eller en ugentlig rapport.Sådan kører du en ugentlig CI-sundhedsrapportCI nedbrydes gradvist, og ingen lægger mærke til det, før det er dårligt.Sådan advarer du om CI-regressionEn ændring gør CI 40 % langsommere, og det går ubemærket hen i ugevis.Hvordan man håndterer skæve CI-jobTester mislykkes tilfældigt, og folk prøver igen, indtil de består.Sådan fejlretter du en fejlende arbejdsgangEt job fejler i CI og fungerer alle andre steder.Sådan indstilles CI-serviceniveauerIngen er enige om, hvor hurtigt CI skal være, så det bliver aldrig prioriteret.Sådan eksponerer du CI-data for AI-agenterAgenter, der fejlfinder CI-fejl, har kun logtekst at arbejde med.
Skala28
Sådan skalerer du selvværtede løbereSelvværtede løbere står enten i kø i spidsbelastningsperioder eller sidder stille og dyrt.Sådan bruger du løbergrupperEthvert lager kan planlægge job på enhver runner.Hvordan man designer en runner label-strategiEtiketter voksede organisk, og ingen ved, hvilke de skal bruge.Hosted eller BYOC: hvordan man vælgerDu er usikker på, om du skal bruge hostede løbere eller implementere i din egen sky.Sådan bruger du genanvendelige arbejdsgange i stor skalaHalvtreds lagre har halvtreds lidt forskellige kopier af den samme pipeline.Hvordan man koordinerer arbejdsgange på tværs af repositoriesEn ændring i ét lager skal udløse builds i andre.Sådan bygger du brugerdefinerede løberbillederHvert job bruger minutter på at installere de samme værktøjer.Sådan udrulles grundlæggende billedopdateringer sikkertEn grundlæggende billedopdatering bryder builds på tværs af mange lagre på én gang.Hvordan man håndterer afhængighedsbot CI-belastningDependabot åbner tredive pull-anmodninger og CI-omkostningsspidser.Sådan arbejder du med samtidighedsgrænserJobs kø, og det er ikke klart, hvilken grænse der er bindende.Hvordan man bruger containerjob effektivtContainerjob giver reproducerbarhed, men bryder caching.Sådan bruges servicebeholdere korrektTests mislykkes med mellemrum ved opstart.Hvordan man bygger én gang og implementerer mange gangeDen samme artefakt er genopbygget til ethvert miljø.Sådan struktureres implementeringsjobImplementeringer er langsomme, risikable og svære at revidere.Hvordan man kører forhåndsvisningsmiljøer effektivtHver pull-anmodning venter på en fuld miljøbygning.Hvordan man strukturerer release buildsUdgivelsesbyg er langsomme og til tider ikke-reproducerbare.Sådan udgiver du byggeartefakterArtefaktlageromkostninger vokser, og opbevaring blev aldrig konfigureret.Sådan håndteres store artefaktuploadsUpload af build-output tager minutter.Sådan får du inkrementelle builds i CICI laver altid en ren build, selvom dit byggesystem understøtter trinvis kompilering.Sådan overfører du data mellem jobJobs skal dele byggeoutput, og det er uklart hvordan.Hvordan man bruger matrix bygger godtMatrixen er vokset, og ingen kan huske, hvorfor hver kombination eksisterer.Sådan styres matrixeksplosionEn lille matrixændring tredoblede jobantallet og regningen.Sådan dimensioneres løbere til Java-buildsDu gætter på en løberstørrelse til en Maven- eller Gradle-bygning.Sådan dimensioneres løbere til Node-testsuiterJest eller Vitest arbejdere enten sulter eller tæsker, og du er ikke sikker på hvilken.Sådan dimensioneres løbere til Python-testsuiterpytest kører på en kerne, mens løberen har otte tomgang.Sådan dimensioneres løbere til Rust-bygningerCargo bygger skala med kerner, men det er uklart, hvor langt det rækker.Sådan dimensioneres løbere til Docker-bygningerDu vælger en løbestørrelse til billedopbygninger.Sådan dimensioneres løbere til Android buildsGradle-samlinger og instrumenteringstest kræver meget forskellige maskiner.