runnerhut
Guider
Lösningar på de CI-problem team faktiskt stöter på.
Hastighet13
Hur man snabbar upp GitHub ActionsDin pipeline tar längre tid än någon vill vänta, och det är inte självklart var tiden tar vägen.Hur man hittar det långsamma steget i ett arbetsflödePipelinen är långsam men varje enskilt steg ser rimligt ut.Hur man minskar GitHub Actions kallstarterJobben sitter i 30 till 90 sekunder innan det första steget körs.Hur man diagnostiserar GitHub Actions kötiderJobben står i kö i minuter innan en löpare hämtar dem.Hur man gör git utcheckning snabbareactions/checkout tar minuter på ett stort förråd.Hur man kör CI på ett mycket stort arkivUtcheckning, indexering och statusrapportering försämras allt eftersom förvaret växer.Hur man snabbar upp Git LFS-utcheckningarLFS-objekt laddas ned seriellt och dominerar utcheckningstiden.Hur man eliminerar ledig tid på jobbJobb spenderar tid på att göra ingenting - väntar på en tjänst, en sömn eller en omröstningsslinga.Hur man hanterar långvariga jobbVissa jobb pågår i timmar och når ibland sextimmarsgränsen.Hur man kör nattbyggen effektivtNattbyggen är dyra och ingen läser resultaten.Hur man stoppar CI rerun stormarUtvecklare kör misslyckade jobb upprepade gånger, multiplicerar kostnaderna och döljer verkliga misslyckanden.Hur man skär tester över en matrisEtt långt testjobb dominerar pipelinen.Hur man kör endast de tester som påverkas av en förändringVarje tryckning kör hela testsviten oavsett vad som ändrades.
Kostnad13
Hur man minskar kostnaderna för GitHub ActionsCI-notan växer snabbare än laget och ingen är säker på varför.Hur man mäter CI-kostnad per pull-förfråganDu vet månadssumman men inte vad en enda pull-förfrågan kostar.Hur man tillskriver CI-kostnad till teamCI-utgifterna är en rad på fakturan och inget team känner ansvar för det.Hur man ställer in en CI-minutersbudgetUtgifterna upptäcks i slutet av månaden snarare än kontrolleras under den.När större löpare faktiskt sparar pengarEn större löpare kostar mer per minut, så det är oklart om det är billigare totalt sett.Hur man minskar kostnader för macOS runnermacOS dominerar CI-räkningen.Hur man minskar CI-utträdeskostnadernaDataöverföring är en stor och växande del av BYOC-notan.Hur man minskar ECR-dragkostnadernaContainer image pulls genererar betydande dataöverföringskostnader.Hur man minskar S3-överföringskostnaderna i CICache- och artefakttrafik till S3 är dyrt.Den verkliga kostnaden för löpare med egen värdLöpare som är självvärdar ser gratis ut bredvid fakturering per minut.Hur man använder punktinstanser för CI-löpareOn-demand-instanser är dyra för arbetsbelastningar som till sin natur går att pröva på nytt.Hur du anpassar dina löpare i rätt storlekLöparstorlekar valdes en gång och återbesöktes aldrig.Hur man kör CI ekonomiskt på öppen källkodCI med öppen källkod är gratis för löpare med GitHub-värd, men långsam, och självhosting är osäkert.
Cachning16
Hur man får CI-cacher att beståCacheminne är konfigurerade men träfffrekvensen är låg.Hur man undviker cachegränsen på 10 GBDina cacheminne överstiger 10 GB per förråd och börjar tyst vräka.Hur man delar en build-cache mellan arkivVarje förråd har sin egen cache för samma delade beroenden.Hur man delar en Docker-cache mellan jobbVarje matrisben bygger om samma lager.Hur man åtgärdar Docker cache-ogiltigförklaringDocker lager byggs om även när de relevanta filerna inte ändrades.Hur man skriver en cache-nyckel som träffarCachen är konfigurerad men missar vid varje körning.Hur man använder cache i GitHub ActionsC- och C++-byggen kompilerar om allt vid varje körning.Hur man använder sccache för Rust-byggenCargo bygger om beroenden när målkatalogcachen missar.Hur man aktiverar Gradle-konfigurationscachenGradle lägger 30 till 60 sekunder på att konfigurera innan han kompilerar något.Hur man cachelagrar verktygskedjehanteraremise, asdf eller proto installera om språkkörningstider vid varje körning.Hur man cachelagrar NuGet-paketdotnet restore laddar ner samma paket vid varje körning.Hur man cachelagrar Jest transformsJest omvandlar varje fil vid varje körning.Hur man cachelagrar vcpkg och Conan-paketC++ beroendehanterare bygger om paket från källkod vid varje körning.Hur man cachelagrar Xcode DerivedDataXcode bygger om hela projektet vid varje CI-körning.Att välja en buildx-cache-backendDet finns fyra cache-backends och det är oklart vilka som ska användas.Hur man håller basgrencachen varmNya funktionsgrenar börjar alltid med en kall cache.
Docker12
Hur man ställer in Docker lagercacheDocker-byggen tar tio minuter eftersom varje lager byggs om.Hur man optimerar en Dockerfile för CISmå kodändringar utlöser långa ombyggnader.Hur man använder flerstegsbyggnader DockerBilderna är stora och innehåller byggverktyg som inte ska skickas.Hur man kör samtidiga Docker bygger säkertParallella matrisben tävlar och bygger långsammare eller misslyckas.Hur man använder en fjärransluten Docker-byggareLagercachen överförs till och från löparen vid varje byggnad.Hur man bygger multiplattformsbilder snabbtAtt lägga till linux/arm64 gör att bygget tar tjugo minuter.Hur man minskar storleken på behållarens bildBilder är hundratals megabyte och långsamma att dra i varje jobb.Hur man skickar hemligheter till en Docker-byggnadDu behöver en privat registertoken eller SSH-nyckel under bygget.Hur man konfigurerar Docker byggarprofilerOlika bilder behöver olika byggarresurser.Hur man bygger många bilder från en monorepoVarje push bygger varje bild i förvaret.Hur man publicerar till flera registerSamma bild byggs en gång per register.Hur man ställer in en register-pull-through-cacheBilddragningen är långsam och du fortsätter att nå Docker Hubhastighetsgränser.
arm647
Hur man flyttar CI till arm64 löpareDu distribuerar till Graviton eller Ampere men bygger på x64.checklista för arm64-migreringDu vill flytta till arm64 utan att bryta pipelinen.Korskompilering kontra infödd arm64Du behöver arm64-binärer och är osäker på om du ska korskompilera eller bygga inbyggt.Varför QEMU arm64 bygger är så långsammaAtt lägga till linux/arm64 till en Docker-build gör det tjugo gånger långsammare.Fixar inbyggda nodmoduler på arm64npm installation misslyckas eller kompileras från källkod på arm64 löpare.Fixar Python-hjul på arm64pip install kompilerar paket från källkod på arm64.Bygger på AWS Graviton löpareDu vill ha Gravitons pris-prestandafördel i CI.
macOS och iOS8
Hur man minskar Xcode-byggtiden i CIXcode-byggen tar tjugo minuter på varje körning.Hur man snabbar upp iOS-simulatortesterSimulatortester tar en halvtimme.Hur man hanterar iOS-kodsignering i CISignering fungerar lokalt och misslyckas periodvis i CI.Hur man notiserar macOS-appar i CINotariseringen går långsamt och ibland tidsgränsar.Åtgärda macOS runner diskutmattningJobb misslyckas utan utrymme kvar på enheten på macOS.Hur man parallelliserar iOS CIiOS CI är seriell och macOS-minuter är dyra.Hur man laddar upp till TestFlight från CITestFlight-uppladdningar är långsamma och misslyckas ibland efter en lyckad konstruktion.Hur man pinnar Xcode-versionerEn uppdatering av löparbilden ändrade tyst Xcode-versionen och din build ändrades med den.
Windows5
Hur man gör Windows CI snabbareWindows-jobb tar tre gånger så lång tid som motsvarande Linux-jobb.Hur man cachelagrar MSBuild-utdataVarje konstruktion kompilerar om alla projekt.Installera Visual Studio-komponenter i CIEn obligatorisk VS-arbetsbelastning saknas och installationen tar femton minuter.Hur man signerar Windows-binärfiler i CIAutentikodsignering behöver ett certifikat som inte får exponeras.Hur man parallelliserar .NET-tester.NET-tester körs i serie och tar tjugo minuter.
Säkerhet6
Hur man hanterar hemligheter i GitHub ActionsHemligheter är spridda över förvarsinställningar och ingen vet vad som fortfarande används.Hur man kör CI-löpare inuti din VPCByggnader måste nå en intern tjänst som inte exponeras offentligt.Hur man ger löpare en statisk IPEn tredjepartstjänst kräver IP-tillståndslistning och värdbaserade löpar-IP:er ändras ständigt.Hur man kör säkerhetsskanningar utan att sakta ner CISårbarhetsskanning lägger till minuter till varje pull-förfrågan.Hur du säkrar din CI-försörjningskedjaTredjepartsåtgärder körs med tillgång till ditt förråd och hemligheter.Hur man förstärker arbetsflödesbehörigheterVarje arbetsflöde körs med skrivåtkomst som det inte behöver.
Observerbarhet10
Hur man samlar in löparmåttDu kan inte avgöra om ett jobb är CPU-bundet, minnesbundet eller diskbundet.Hur man spårar byggvaraktighetspercentilerGenomsnittlig byggtid ser bra ut men utvecklare klagar fortfarande.Hur man exporterar CI-spår med OpenTelemetryCI-timingdata finns i ett separat verktyg från resten av din observerbarhet.Hur man frågar CI-data programmatisktDu behöver CI-data i en instrumentpanel eller en veckorapport.Hur man kör en veckovis CI-hälsorapportCI försämras gradvis och ingen märker det förrän det är dåligt.Hur man larmar om CI-regressionerEn förändring gör CI 40% långsammare och det går obemärkt förbi i veckor.Hur man hanterar fläckiga CI-jobbTesterna misslyckas slumpmässigt och folk försöker igen tills de blir godkända.Hur man felsöker ett misslyckat arbetsflödeEtt jobb misslyckas i CI och fungerar överallt annars.Hur man ställer in CI-servicenivåerIngen är överens om hur snabb CI ska vara, så det blir aldrig prioriterat.Hur man exponerar CI-data för AI-agenterAgenter som felsöker CI-fel har bara loggtext att arbeta med.
Skala28
Hur man skalar självvärdiga löpareLöpare som är självvärdar ställer sig antingen i kö på topp eller sitter sysslolösa och dyra.Hur man använder löpargrupperAlla förråd kan schemalägga jobb på vilken löpare som helst.Hur man utformar en strategi för löparetiketterEtiketter växte ekologiskt och ingen vet vilka de ska använda.Hosted eller BYOC: hur man väljerDu är osäker på om du ska använda värdbaserade löpare eller distribuera i ditt eget moln.Hur man använder återanvändbara arbetsflöden i stor skalaFemtio förråd har femtio något olika kopior av samma pipeline.Hur man koordinerar arbetsflöden över arkivEn förändring i ett arkiv måste utlösa byggnationer i andra.Hur man bygger anpassade löparbilderVarje jobb ägnar minuter åt att installera samma verktyg.Hur man rullar ut basbilduppdateringar på ett säkert sättEn basbilduppdatering bryter byggen över många arkiv samtidigt.Hur man hanterar CI-belastning för beroendebotDependabot öppnar trettio pull-förfrågningar och CI-kostnadstoppar.Hur man arbetar med samtidighetsgränserJobbkö och det framgår inte vilken gräns som är bindande.Hur man använder containerjobb effektivtContainerjobb ger reproducerbarhet men bryter cachelagring.Hur man använder servicebehållare på rätt sättTesterna misslyckas periodvis vid start.Hur man bygger en gång och distribuerar många gångerSamma artefakt byggs om för varje miljö.Hur man strukturerar utbyggnadsjobbImplementeringarna är långsamma, riskfyllda och svåra att granska.Hur man kör förhandsgranskningsmiljöer effektivtVarje pull-begäran väntar på en komplett miljöbyggnad.Hur man strukturerar release buildsUtgivningsbyggen är långsamma och ibland inte reproducerbara.Hur man publicerar byggartefakterLagringskostnaderna för artefakter ökar och retention konfigurerades aldrig.Hur man hanterar stora artefaktuppladdningarAtt ladda upp build-utdata tar några minuter.Hur man får inkrementella byggnader i CICI gör alltid en ren build även om ditt byggsystem stöder inkrementell kompilering.Hur man skickar data mellan jobbJobb måste dela byggproduktion och det är oklart hur.Hur man använder matris bygger braMatrisen har växt och ingen kommer ihåg varför varje kombination existerar.Hur man kontrollerar matrisexplosionEn liten matrisbyte tredubblade antalet jobb och räkningen.Hur man storleksanpassar löpare för Java-byggenDu gissar på en löparstorlek för ett Maven- eller Gradle-bygge.Hur man storleksanpassar löpare för Node-testsviterJost- eller Vitest-arbetare svälter eller slår och du är inte säker på vilken.Hur man storleksanpassar löpare för Python-testsviterpytest körs på en kärna medan löparen har åtta lediga.Hur man dimensionerar löpare för Rust-byggenCargo bygger skala med kärnor, men det är oklart hur långt det räcker.Hur man dimensionerar löpare för Docker-byggenDu väljer en löparstorlek för bildbyggen.Hur man storleksanpassar löpare för Android-byggenGradle monteringar och instrumentering tester kräver mycket olika maskiner.