Lo scopo di questa risposta è mostrare come è possibile eseguire la memorizzazione nella cache con le azioni github. Non necessariamente per mostrare come memorizzare nella cache valgrind
, cosa che mostra, ma anche per mostrare che non tutto può / dovrebbe essere memorizzato nella cache, e devono essere presi in considerazione i compromessi della memorizzazione nella cache e del ripristino di una cache rispetto alla reinstallazione della dipendenza.
Farai uso actions/cache
dell'azione per fare questo.
Aggiungilo come passaggio (prima di utilizzare valgrind):
- name: Cache valgrind
uses: actions/cache@v1.0.3
id: cache-valgrind
with:
path: "~/valgrind"
key: ${{secrets.VALGRIND_VERSION}}
Il passaggio successivo dovrebbe tentare di installare la versione cache se presente o installare dai repository:
- name: Install valgrind
env:
CACHE_HIT: ${{steps.cache-valgrind.outputs.cache-hit}}
VALGRIND_VERSION: ${{secrets.VALGRIND_VERSION}}
run: |
if [[ "$CACHE_HIT" == 'true' ]]; then
sudo cp --verbose --force --recursive ~/valgrind/* /
else
sudo apt-get install --yes valgrind="$VALGRIND_VERSION"
mkdir -p ~/valgrind
sudo dpkg -L valgrind | while IFS= read -r f; do if test -f $f; then echo $f; fi; done | xargs cp --parents --target-directory ~/valgrind/
fi
Spiegazione
Imposta il VALGRIND_VERSION
segreto come output di:
apt-cache policy valgrind | grep -oP '(?<=Candidate:\s)(.+)'
questo ti permetterà di invalidare la cache quando viene rilasciata una nuova versione semplicemente modificando il valore del segreto.
dpkg -L valgrind
viene utilizzato per elencare tutti i file installati durante l'utilizzo sudo apt-get install valgrind
.
Ciò che ora possiamo fare con questo comando è copiare tutte le dipendenze nella nostra cartella cache:
dpkg -L valgrind | while IFS= read -r f; do if test -f $f; then echo $f; fi; done | xargs cp --parents --target-directory ~/valgrind/
inoltre
Oltre a copiare tutti i componenti di valgrind
, potrebbe anche essere necessario copiare le dipendenze (come libc
in questo caso), ma non consiglio di continuare lungo questo percorso perché la catena delle dipendenze cresce da lì. Per essere precisi, le dipendenze necessarie per copiare per avere finalmente un ambiente adatto a valgrind per funzionare sono le seguenti:
Per copiare tutte queste dipendenze, è possibile utilizzare la stessa sintassi di cui sopra:
for dep in libc6 libgcc1 gcc-8-base; do
dpkg -L $dep | while IFS= read -r f; do if test -f $f; then echo $f; fi; done | xargs cp --parents --target-directory ~/valgrind/
done
Tutto questo lavoro vale davvero la pena quando valgrind
in primo luogo tutto ciò che è necessario per installare è semplicemente eseguire sudo apt-get install valgrind
? Se il tuo obiettivo è velocizzare il processo di compilazione, devi anche prendere in considerazione la quantità di tempo necessaria per ripristinare (scaricare ed estrarre) la cache e semplicemente eseguire nuovamente il comando per installare valgrind
.
E infine per ripristinare la cache, supponendo che sia archiviata in /tmp/valgrind
, è possibile utilizzare il comando:
cp --force --recursive /tmp/valgrind/* /
Il che sostanzialmente copierà tutti i file dalla cache alla partizione root.
Oltre al processo sopra, ho anche un esempio di "memorizzazione nella cache di valgrind" installandolo e compilandolo dal sorgente. La cache ora ha una dimensione di circa 63 MB (compressa) e si deve ancora installare separatamente libc
quale tipo di sconfigge lo scopo.
Riferimenti:
Cache not found for input keys: ***.
. Ho aggiunto ilVALGRIND_VERSION
segreto in Impostazioni> Segreti, giusto?