Quando nei progetti si hanno dipendenze di terze parti (per esempio NuGet package, npm, Yarn, pip, etc.), l'operazione di restore o installazione di queste dipendenze potrebbe richiedere una grande quantità di tempo, che è proporzionale al numero di dipendenze. Questo tempo è ottimizzabile sfruttando la GitHub Action chiamata cache, che può salvare, appunto, una cache delle dipendenze, così che poi non debbano più essere re-installate nell'operazione di restore.
- uses: actions/cache@v1 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} restore-keys: | ${{ runner.os }}-nuget- - name: Install dependencies run: dotnet restore
In questo caso l'esempio è predisposto per .NET, ma sarà similare per gli altri package manager. L'operazione di cache viene eseguita sempre prima del restore e va a salvare, sotto una chiave precisa, tutte le mie dipendenze, nel momento in cui ci sia un cache miss (ovvero la chiave non esiste perchè è la prima esecuzione) e, quindi, l'operazione di restore installerà tutte le dipendenze.
Run actions/cache@v2 Cache not found for input keys: Windows-nuget2-3881b0e254e4b0c4e40edd9efa8c26dfd9f5c93c42dad979f6c5869b765a72d0, Windows-nuget2- Post Run actions/cache@v2 Cache saved successfully Post job cleanup.
Nel secondo run della pipeline, ci sarà invece un cache hit (in base al nome della chiave) e, quindi, le dipendenze verranno scaricate e unzippate dallo step di cache, poi, il restore, che dovrebbe fare uso del packages.lock.json, sarà molto più veloce, quasi immediato.
Run actions/cache@v2 Cache Size: ~116 MB (122108071 B) C:\windows\System32\tar.exe -z -xf d:/a/_temp/50db9096-3e6c-4681-8753-3e12e33854f1/cache.tgz -P -C d:/a/VsShowMissing/VsShowMissing Cache restored from key: Windows-nuget2-3881b0e254e4b0c4e40edd9efa8c26dfd9f5c93c42dad979f6c5869b765a72d0
L'uso della cache è vantaggioso solo in quei casi in cui ci siano veramente molte dipendenze. D'altronde vengono comunque scaricate tutte e unzippate localmente quindi, quando ci sono poche dipendenze, potrebbe essere che ci troviamo addirittura un overhead in termini temporali rispetto ad una esecuzione senza cache. Quando ce ne sono tante, invece, l'operazione risulterà più veloce perchè la cache sarà tenuta in una location molto vicina a quella della VM che eseguirà il workflow, pertanto l'operazione di download dovrebbe essere più veloce, ma va chiaramente misurato caso per caso per vederne l'efficacia.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Implementare l'infinite scroll con QuickGrid in Blazor Server
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Introduzione ai web component HTML
Eseguire script pre e post esecuzione di un workflow di GitHub
Escludere alcuni file da GitHub Secret Scanning
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Utilizzare Container Queries nominali
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Creare una libreria CSS universale: Immagini
Fornire parametri ad un Web component HTML
Recuperare automaticamente un utente e aggiungerlo ad un gruppo di Azure DevOps
Creare una libreria CSS universale: Nav menu