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.
Docker12
Come impostare la memorizzazione nella cache dei livelli DockerLe build Docker richiedono dieci minuti perché ogni livello viene ricostruito.Come ottimizzare un Dockerfile per CIPiccole modifiche al codice innescano lunghe ricostruzioni.Come utilizzare build Docker multifaseLe immagini sono grandi e contengono strumenti di costruzione che non dovrebbero essere spediti.Come eseguire build Docker simultanee in modo sicuroLe gambe della matrice parallela si contendono e le costruzioni rallentano o falliscono.Come utilizzare un builder Docker remotoLa cache dei livelli viene trasferita da e verso il corridore su ogni build.Come creare velocemente immagini multipiattaformaL'aggiunta di linux/arm64 fa sì che la compilazione richieda venti minuti.Come ridurre le dimensioni dell'immagine del contenitoreLe immagini pesano centinaia di megabyte e sono lente da inserire in ogni lavoro.Come passare i segreti in una build DockerDurante la compilazione è necessario un token di registro privato o una chiave SSH.Come configurare i profili builder DockerImmagini diverse richiedono risorse del builder diverse.Come costruire molte immagini da un monorepoOgni push crea ogni immagine nel repository.Come pubblicare su più registriLa stessa immagine viene creata una volta per registro.Come impostare una cache pull-through del registroI pull delle immagini sono lenti e continui a raggiungere i limiti di velocità dell'hub Docker.
braccio647
Come spostare CI sui corridori arm64Distribuisci su Graviton o Ampere ma costruisci su x64.Elenco di controllo per la migrazione arm64Vuoi passare a arm64 senza interrompere la pipeline.Compilazione incrociata rispetto a arm64 nativoHai bisogno dei binari arm64 e non sei sicuro se eseguire la compilazione incrociata o compilare in modo nativo.Perché le build QEMU arm64 sono così lenteL'aggiunta di linux/arm64 a una build Docker la rende venti volte più lenta.Correzione dei moduli nativi del nodo su arm64L'installazione di npm non riesce o viene compilata dal sorgente sui corridori arm64.Fissaggio delle ruote Python sul braccio64pip install compila i pacchetti dal sorgente su arm64.Basandosi su corridori AWS GravitonDesideri il vantaggio in termini di rapporto qualità-prezzo di Graviton in CI.
macOS e iOS8
Come ridurre i tempi di compilazione di Xcode in CILe build di Xcode richiedono venti minuti per ogni esecuzione.Come velocizzare i test del simulatore iOSI test del simulatore durano mezz'ora.Come gestire la firma del codice iOS in CILa firma funziona localmente e fallisce in modo intermittente in CI.Come autenticare le app macOS in CIL'autenticazione notarile è lenta e occasionalmente scade.Correzione dell'esaurimento del disco runner di macOSI processi falliscono senza spazio rimasto sul dispositivo su macOS.Come parallelizzare l'CI iOSiOS CI è seriale e i minuti macOS sono costosi.Come caricare su TestFlight da CII caricamenti di TestFlight sono lenti e talvolta falliscono dopo una compilazione riuscita.Come bloccare le versioni di XcodeUn aggiornamento dell'immagine del runner ha modificato silenziosamente la versione di Xcode e la tua build è cambiata con essa.
Finestre5
Come rendere l'interfaccia CI di Windows più veloceI lavori Windows richiedono tre volte il tempo rispetto ai lavori Linux equivalenti.Come memorizzare nella cache l'output di MSBuildOgni build ricompila tutti i progetti.Installazione dei componenti di Visual Studio in CIManca un carico di lavoro VS richiesto e l'installazione richiede quindici minuti.Come firmare i file binari di Windows in CILa firma Authenticode necessita di un certificato che non deve essere esposto.Come parallelizzare i test .NETI test .NET vengono eseguiti in serie e richiedono venti minuti.
Sicurezza6
Come gestire i segreti in GitHub ActionsI segreti sono sparsi nelle impostazioni del repository e nessuno sa cosa viene ancora utilizzato.Come eseguire i runner CI all'interno del tuo VPCLe build devono raggiungere un servizio interno che non sia esposto pubblicamente.Come dare ai corridori un IP staticoUn servizio di terze parti richiede l'inserimento nella lista consentita degli IP e gli IP dei runner ospitati cambiano costantemente.Come eseguire scansioni di sicurezza senza rallentare CILa scansione delle vulnerabilità aggiunge minuti a ogni richiesta pull.Come proteggere la catena di fornitura CILe azioni di terze parti vengono eseguite con accesso al repository e ai segreti.Come rafforzare le autorizzazioni del flusso di lavoroOgni flusso di lavoro viene eseguito con l'accesso in scrittura di cui non ha bisogno.
Osservabilità10
Come raccogliere le metriche dei corridoriNon è possibile stabilire se un lavoro è legato alla CPU, alla memoria o al disco.Come tenere traccia dei percentili di durata della compilazioneIl tempo di costruzione medio sembra soddisfacente, ma gli sviluppatori continuano a lamentarsi.Come esportare le tracce CI con OpenTelemetryI dati temporali CI risiedono in uno strumento separato dal resto della tua osservabilità.Come eseguire query sui dati CI a livello di codiceHai bisogno di dati CI in una dashboard o in un report settimanale.Come eseguire un report settimanale sullo stato dell'ICLa CI si degrada gradualmente e nessuno se ne accorge finché non diventa pessima.Come inviare avvisi sulle regressioni CIUna modifica rende l'IC più lenta del 40% e passa inosservata per settimane.Come gestire i lavori CI instabiliI test falliscono in modo casuale e le persone riprovano finché non li superano.Come eseguire il debug di un flusso di lavoro in erroreUn lavoro fallisce in CI e funziona ovunque.Come impostare i livelli di servizio CINessuno è d'accordo su quanto dovrebbe essere veloce la CI, quindi non viene mai data priorità.Come esporre i dati CI agli agenti AIGli agenti che eseguono il debug degli errori CI hanno solo il testo del registro con cui lavorare.
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.