Sari la conținut

runnerhut

Ghiduri

Soluții pentru problemele de CI pe care echipele chiar le întâlnesc.

Viteza13

Cum să accelerezi GitHub ActionsConducta dvs. durează mai mult decât vrea oricine să aștepte și nu este evident unde trece timpul.Cum să găsiți pasul lent într-un flux de lucruConducta este lentă, dar fiecare pas individual pare rezonabil.Cum să reduceți GitHub Actions pornirile la receLucrările stau timp de 30 până la 90 de secunde înainte de a rula primul pas.Cum să diagnosticați GitHub Actions timpii de coadăLucrările sunt puse la coadă câteva minute înainte ca un alergător să le ridice.Cum să faci git checkout mai rapidacțiunile/checkout durează minute într-un depozit mare.Cum să rulați CI pe un depozit foarte mareVerificarea, indexarea și raportarea stării se degradează pe măsură ce depozitul crește.Cum să accelerezi plățile Git LFSObiectele LFS se descarcă în serie și domină timpul de plată.Cum să eliminați timpul inactiv în locuri de muncăLocurile de muncă petrec timp fără a face nimic - așteptând un serviciu, un somn sau o buclă de sondaj.Cum să gestionați locurile de muncă de lungă duratăUnele lucrări rulează ore întregi și ocazional ating limita de șase ore.Cum să rulezi eficient construcțiile de noapteBuild-urile nocturne sunt scumpe și nimeni nu citește rezultatele.Cum să opriți furtunile de reluare a CIDezvoltatorii reluează în mod repetat lucrările eșuate, înmulțind costurile și ascund eșecurile reale.Cum să împărțiți testele într-o matriceO lucrare de testare lungă domină conducta.Cum să rulați numai testele afectate de o modificareFiecare push rulează întreaga suită de testare, indiferent de ce s-a schimbat.

Cost13

Cum să reduceți costurile GitHub ActionsFactura CI crește mai repede decât echipa și nimeni nu este sigur de ce.Cum se măsoară costul CI pe cerere de extragereȘtiți totalul lunar, dar nu cât costă o singură cerere de tragere.Cum să atribuiți costul CI echipelorCheltuielile CI reprezintă un rând pe factură și nicio echipă nu se simte responsabilă pentru asta.Cum să setați un buget pentru minute CICheltuielile sunt descoperite la sfârșitul lunii, mai degrabă decât controlate în timpul acesteia.Când alergătorii mai mari economisesc baniUn alergător mai mare costă mai mult pe minut, așa că nu este clar dacă este mai ieftin în general.Cum să reduceți costurile macOS RunnermacOS domină factura CI.Cum să reduceți costurile de ieșire CITransferul de date reprezintă o parte mare și în creștere din factura BYOC.Cum să reduceți costurile de extragere ECRTragerile de imagini ale containerului generează taxe semnificative de transfer de date.Cum să reduceți costurile de transfer S3 în CICache-ul și traficul de artefacte către S3 este costisitor.Costul real al alergătorilor auto-găzduițiAlergătorii auto-găzduiți arată gratuit lângă facturarea pe minut.Cum să utilizați instanțe spot pentru alergătorii CIInstanțele la cerere sunt costisitoare pentru sarcinile de lucru care pot fi reîncercate în mod inerent.Cum să-ți dimensionezi alergătoriiMărimile alergătorului au fost alese o dată și nu au fost niciodată revăzute.Cum să rulați CI economic pe sursă deschisăCI cu sursă deschisă este gratuit pentru alergătorii găzduiți de GitHub, dar lent, iar auto-găzduirea este nesigură.

Memorarea în cache16

Cum să faci ca cache-urile CI să persistă de faptCache-urile sunt configurate, dar rata de accesare este scăzută.Cum să ocoliți limita de 10 GB cacheCache-urile dvs. depășesc 10 GB per depozit și începeți evacuarea în tăcere.Cum să partajați un cache de compilare între depoziteFiecare depozit își menține propriul cache pentru aceleași dependențe partajate.Cum să partajați un cache Docker între joburiFiecare picior de matrice reconstruiește aceleași straturi.Cum se remediază invalidarea cache-ului DockerStraturile Docker se reconstruiesc chiar și atunci când fișierele relevante nu s-au schimbat.Cum se scrie o cheie cache care loveșteCache-ul este configurat, dar lipsește la fiecare rulare.Cum să utilizați ccache în GitHub ActionsBuild-urile C și C++ recompilează totul la fiecare rulare.Cum se utilizează sccache pentru versiunile RustCargo reconstruiește dependențele ori de câte ori lipsește memoria cache a directorului țintă.Cum să activați memoria cache de configurare GradleGradle petrece între 30 și 60 de secunde pentru a configura înainte de a compila orice.Cum să memorați în cache managerii lanțului de instrumentemise, asdf sau proto reinstalează timpii de execuție a limbii la fiecare rulare.Cum să memorați în cache pachetele NuGetdotnet restore descarcă aceleași pachete la fiecare rulare.Cum să memorezi în cache transformările JestJest re-transformă fiecare fișier la fiecare rulare.Cum să memorați în cache pachetele vcpkg și ConanManagerii de dependențe C++ reconstruiesc pachetele din sursă la fiecare rulare.Cum să memorați în cache Xcode DerivedDataXcode reconstruiește întregul proiect la fiecare rulare CI.Alegerea unui backend cache buildxExistă patru backend-uri cache și nu este clar pe care să le folosiți.Cum să păstrați cache-ul ramurilor de bază caldNoile ramuri de caracteristici încep întotdeauna cu un cache rece.

Docker12

Cum se configurează memorarea în cache a stratului DockerConstruirea Docker durează zece minute, deoarece fiecare strat se reconstruiește.Cum să optimizați un Dockerfile pentru CIModificările mici ale codului declanșează reconstrucții lungi.Cum să utilizați versiunile în mai multe etape DockerImaginile sunt mari și conțin instrumente de construcție care nu ar trebui să fie expediate.Cum să rulați în siguranță versiunile concurente DockerPicioarele matricei paralele se luptă și construcțiile încetinesc sau eșuează.Cum să utilizați un generator Docker de la distanțăCache-ul stratului este transferat către și de la runner la fiecare build.Cum să construiți rapid imagini multi-platformăAdăugarea linux/arm64 face ca construcția să dureze douăzeci de minute.Cum să reduceți dimensiunea imaginii containeruluiImaginile sunt de sute de megaocteți și sunt lent pentru fiecare lucrare.Cum să transferați secrete într-o versiune DockerAveți nevoie de un token de registru privat sau cheie SSH în timpul construirii.Cum să configurați profilurile de constructor DockerImagini diferite au nevoie de resurse diferite de constructor.Cum să construiți multe imagini dintr-un monorepoFiecare push construiește fiecare imagine din depozit.Cum se publică în mai multe registreAceeași imagine este construită o dată pe registru.Cum să configurați un cache de tip pull-through de registryAtragerile de imagini sunt lente și continuați să atingeți limitele de rată de la Docker Hub.

Scară28

Cum să scalați alergătorii auto-găzduițiAlergătorii auto-găzduiți fie stau la coadă la vârf, fie stau inactiv și sunt scumpi.Cum se utilizează grupurile de alergătoriOrice depozit poate programa joburi pe orice runner.Cum să proiectați o strategie de etichetă de alergătorEtichetele au crescut organic și nimeni nu știe pe care să le folosească.Găzduit sau BYOC: cum să alegiNu sunteți sigur dacă folosiți alergători găzduiți sau implementați în propriul dvs. cloud.Cum să utilizați fluxurile de lucru reutilizabile la scarăCincizeci de depozite au cincizeci de copii ușor diferite ale aceleiași conducte.Cum să coordonați fluxurile de lucru între depoziteO schimbare într-un depozit trebuie să declanșeze versiuni în altele.Cum să construiți imagini personalizate ale alergătorilorFiecare lucrare petrece câteva minute instalând aceleași instrumente.Cum să lansați actualizările imaginii de bază în siguranțăO actualizare de bază a imaginii întrerupe versiunile în mai multe depozite simultan.Cum să gestionați încărcarea CI pentru bot de dependențăDependabot deschide treizeci de solicitări de extragere și crește costurile CI.Cum să lucrați cu limite de concurențăCoada de locuri de muncă și nu este clar care limită este obligatorie.Cum să utilizați eficient lucrările containeruluiLucrările container oferă reproductibilitate, dar întrerup stocarea în cache.Cum să utilizați corect containerele de serviceTestele eșuează intermitent la pornire.Cum să construiți o dată și să implementați de mai multe oriAcelași artefact este reconstruit pentru fiecare mediu.Cum să structurați joburile de implementareImplementările sunt lente, riscante și greu de auditat.Cum să rulați eficient mediile de previzualizareFiecare cerere de extragere așteaptă o construcție completă a mediului.Cum să structurați versiunile de versiuniVersiunile de lansare sunt lente și uneori nereproductibile.Cum se publică artefacte de construcțieCosturile de stocare a artefactelor sunt în creștere și păstrarea nu a fost niciodată configurată.Cum să gestionați încărcările mari de artefacteÎncărcarea ieșirii versiunii durează câteva minute.Cum să obțineți versiuni incrementale în CICI face întotdeauna o construcție curată, chiar dacă sistemul dvs. de compilare acceptă compilarea incrementală.Cum să transferați date între locuri de muncăLocurile de muncă trebuie să partajeze producția de construcție și nu este clar cum.Cum să utilizați matricea construiește bineMatricea a crescut și nimeni nu-și amintește de ce există fiecare combinație.Cum se controlează explozia matriceiO mică modificare a matricei a triplat numărul de locuri de muncă și factura.Cum se dimensionează runnerele pentru versiunile JavaGhiciți o dimensiune de alergător pentru o construcție Maven sau Gradle.Cum se dimensionează runnerele pentru suitele de testare NodeLucrătorii Jest sau Vitest fie mor de foame, fie se bat și nu sunteți sigur care.Cum se dimensionează runnerele pentru suitele de testare Pythonpytest rulează pe un nucleu, în timp ce runnerul are opt inactiv.Cum se dimensionează ghidajele pentru construcția RustCargo creează scară cu miezuri, dar nu este clar cât de departe ajunge.Cum se dimensionează rulourile pentru versiunile DockerAlegeți o dimensiune de rulare pentru imagini.Cum să dimensionați alergătorii pentru versiunile AndroidAsamblarea Gradle și testele de instrumentare necesită mașini foarte diferite.