Vai al contenuto

runnerhut

Guide

Soluzioni ai problemi di CI che i team incontrano davvero.

Velocità13

Come velocizzare GitHub ActionsLa tua pipeline richiede più tempo di quanto chiunque voglia aspettare e non è ovvio dove va il tempo.Come trovare il passaggio lento in un flusso di lavoroIl processo è lento ma ogni singolo passo sembra ragionevole.Come ridurre GitHub Actions avviamenti a freddoI processi rimangono in attesa per un periodo compreso tra 30 e 90 secondi prima dell'esecuzione del primo passaggio.Come diagnosticare i tempi di coda di GitHub ActionsI lavori vengono messi in coda per minuti prima che un corridore li raccolga.Come velocizzare il checkout di Gitle azioni/il checkout richiedono pochi minuti su un repository di grandi dimensioni.Come eseguire CI su un repository molto grandeIl checkout, l'indicizzazione e la segnalazione dello stato peggiorano man mano che il repository cresce.Come velocizzare i checkout Git LFSGli oggetti LFS vengono scaricati in serie e dominano il tempo di checkout.Come eliminare i tempi morti nel lavoroI lavori trascorrono il tempo senza fare nulla: aspettando un servizio, una sospensione o un ciclo di sondaggi.Come gestire i lavori di lunga durataAlcuni lavori durano ore e occasionalmente raggiungono il limite di sei ore.Come eseguire le build notturne in modo efficienteLe build notturne sono costose e nessuno legge i risultati.Come fermare le tempeste di repliche di CIGli sviluppatori rieseguono ripetutamente i lavori falliti, moltiplicando i costi e nascondendo i veri fallimenti.Come suddividere i test su una matriceUn lungo lavoro di test domina la pipeline.Come eseguire solo i test interessati da una modificaOgni push esegue l'intera suite di test indipendentemente da cosa è cambiato.

Costo13

Come ridurre i costi di GitHub ActionsLa fattura del CI cresce più velocemente della squadra e nessuno è sicuro del perché.Come misurare il costo CI per richiesta pullConosci il totale mensile ma non quanto costa una singola richiesta pull.Come attribuire il costo CI ai teamLa spesa CI è una riga sulla fattura e nessun team si sente responsabile per essa.Come impostare un budget di minuti CILa spesa viene scoperta alla fine del mese anziché controllata durante lo stesso.Quando i corridori più grandi risparmiano effettivamente denaroUn corridore più grande costa di più al minuto, quindi non è chiaro se sia complessivamente più economico.Come tagliare i costi del runner macOSmacOS domina la fattura CI.Come ridurre i costi di uscita CIIl trasferimento dei dati rappresenta una quota ampia e crescente della fattura BYOC.Come ridurre i costi di pull ECRI pull delle immagini del contenitore generano costi di trasferimento dati significativi.Come ridurre i costi di trasferimento S3 in CIIl traffico di cache e artefatti verso S3 è costoso.Il costo reale dei corridori self-hostedI corridori self-hosted appaiono gratuiti accanto alla fatturazione al minuto.Come utilizzare le istanze Spot per i corridori CILe istanze su richiesta sono costose per i carichi di lavoro che sono intrinsecamente ripetibili.Come dimensionare correttamente i tuoi corridoriLe dimensioni dei corridori sono state scelte una volta e mai rivisitate.Come eseguire la CI in modo economico su open sourceL'IC open source è gratuita sui runner ospitati su GitHub ma è lenta e l'hosting autonomo non è sicuro.

Memorizzazione nella cache16

Come rendere effettivamente persistenti le cache CILe cache sono configurate ma il tasso di successo è basso.Come aggirare il limite della cache di 10 GBLe tue cache superano i 10 GB per repository e iniziano a essere eliminate silenziosamente.Come condividere una cache di build tra repositoryOgni repository mantiene la propria cache per le stesse dipendenze condivise.Come condividere una cache Docker tra lavoriOgni gamba della matrice ricostruisce gli stessi strati.Come risolvere l'invalidazione della cache DockerI livelli Docker vengono ricostruiti anche quando i file rilevanti non sono cambiati.Come scrivere una chiave di cache che colpisceLa cache è configurata ma manca ad ogni esecuzione.Come utilizzare ccache in GitHub ActionsLe build C e C++ ricompilano tutto ad ogni esecuzione.Come usare sccache per le build RustCargo ricostruisce le dipendenze ogni volta che manca la cache della directory di destinazione.Come abilitare la cache di configurazione di GradleGradle impiega dai 30 ai 60 secondi per configurare prima di compilare qualsiasi cosa.Come memorizzare nella cache i gestori della toolchainmise, asdf o proto reinstallano i runtime della lingua a ogni esecuzione.Come memorizzare nella cache i pacchetti NuGetdotnet Restore scarica gli stessi pacchetti a ogni esecuzione.Come memorizzare nella cache le trasformazioni JestJest ritrasforma ogni file ad ogni esecuzione.Come memorizzare nella cache i pacchetti vcpkg e ConanI gestori delle dipendenze C++ ricostruiscono i pacchetti dall'origine a ogni esecuzione.Come memorizzare nella cache Xcode DerivedDataXcode ricostruisce l'intero progetto ad ogni esecuzione CI.Scelta di un backend cache buildxEsistono quattro backend cache e non è chiaro quale utilizzare.Come mantenere calda la cache del ramo baseI nuovi rami di funzionalità iniziano sempre con una cache fredda.

Scala28

Come scalare i corridori self-hostedI corridori self-hosted fanno la fila nelle ore di punta o restano inattivi e costosi.Come utilizzare i gruppi di corridoriQualsiasi repository può pianificare lavori su qualsiasi corridore.Come progettare una strategia per l'etichetta runnerLe etichette sono cresciute in modo organico e nessuno sa quale utilizzare.Hosted o BYOC: come scegliereNon sei sicuro se utilizzare i corridori ospitati o eseguire la distribuzione nel tuo cloud.Come utilizzare flussi di lavoro riutilizzabili su larga scalaCinquanta repository hanno cinquanta copie leggermente diverse della stessa pipeline.Come coordinare i flussi di lavoro tra repositoryUna modifica in un repository deve attivare build in altri.Come creare immagini di corridori personalizzateOgni lavoro richiede minuti per installare gli stessi strumenti.Come implementare in modo sicuro gli aggiornamenti dell'immagine di baseUn aggiornamento dell'immagine di base interrompe le build su più repository contemporaneamente.Come gestire il caricamento dell'elemento CI del bot delle dipendenzeDependabot apre trenta richieste pull e picchi di costi CI.Come lavorare con i limiti di concorrenzaI lavori sono in coda e non è chiaro quale limite sia vincolante.Come utilizzare i processi in container in modo efficaceI processi contenitore forniscono riproducibilità ma interrompono la memorizzazione nella cache.Come utilizzare correttamente i contenitori di serviziI test falliscono in modo intermittente all'avvio.Come creare una volta e distribuire più voltePer ogni ambiente viene ricostruito lo stesso manufatto.Come strutturare i lavori di distribuzioneLe implementazioni sono lente, rischiose e difficili da controllare.Come eseguire gli ambienti di anteprima in modo efficienteOgni richiesta pull attende la compilazione di un ambiente completo.Come strutturare le build di rilascioLe build di rilascio sono lente e occasionalmente non riproducibili.Come pubblicare artefatti di buildI costi di archiviazione degli artefatti sono in aumento e la conservazione non è mai stata configurata.Come gestire i caricamenti di artefatti di grandi dimensioniIl caricamento dell'output della build richiede pochi minuti.Come ottenere build incrementali in CICI esegue sempre una compilazione pulita anche se il sistema di compilazione supporta la compilazione incrementale.Come passare i dati tra i lavoriI lavori devono condividere l'output di costruzione e non è chiaro come.Come usare la matrice si costruisce beneLa matrice è cresciuta e nessuno ricorda perché esiste ciascuna combinazione.Come controllare l'esplosione della matriceUn piccolo cambiamento nella matrice ha triplicato il numero di posti di lavoro e la bolletta.Come dimensionare i corridori per le build JavaStai indovinando la dimensione del corridore per una build Maven o Gradle.Come dimensionare i corridori per le suite di test NodeI lavoratori di Jest o Vitest stanno morendo di fame o si dimenano e non sei sicuro di quale.Come dimensionare i corridori per le suite di test Pythonpytest è in esecuzione su un core mentre il corridore ne ha otto inattivi.Come dimensionare i corridori per le costruzioni RustCargo costruisce una scala con i nuclei, ma non è chiaro fino a che punto si arrivi.Come dimensionare i corridori per le build DockerStai scegliendo una dimensione del corridore per le build di immagini.Come dimensionare i corridori per le build AndroidGli assemblaggi Gradle e i test di strumentazione necessitano di macchine molto diverse.