Le but de cette réponse est de montrer comment la mise en cache peut être effectuée avec des actions github. Pas nécessairement pour montrer comment mettre en cache valgrind
, ce qu'il montre, mais aussi pour montrer que tout ne peut / ne doit pas être mis en cache, et les compromis de la mise en cache et de la restauration d'un cache par rapport à la réinstallation de la dépendance doivent être pris en compte.
Vous utiliserez l' actions/cache
action pour ce faire.
Ajoutez-le comme une étape (avant d'utiliser Valgrind):
- name: Cache valgrind
uses: actions/[email protected]
id: cache-valgrind
with:
path: "~/valgrind"
key: ${{secrets.VALGRIND_VERSION}}
L'étape suivante doit tenter d'installer la version en cache, le cas échéant, ou d'installer à partir des référentiels:
- 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
Explication
Définissez VALGRIND_VERSION
secret comme la sortie de:
apt-cache policy valgrind | grep -oP '(?<=Candidate:\s)(.+)'
cela vous permettra d'invalider le cache lorsqu'une nouvelle version est publiée simplement en changeant la valeur du secret.
dpkg -L valgrind
est utilisé pour répertorier tous les fichiers installés lors de l'utilisation sudo apt-get install valgrind
.
Ce que nous pouvons maintenant faire avec cette commande est de copier toutes les dépendances dans notre dossier 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/
en outre
En plus de copier tous les composants de valgrind
, il peut également être nécessaire de copier les dépendances (comme libc
dans ce cas), mais je ne recommande pas de continuer sur cette voie car la chaîne de dépendances ne fait que croître à partir de là. Pour être précis, les dépendances nécessaires pour copier pour enfin avoir un environnement adapté à Valgrind pour s'exécuter sont les suivantes:
Pour copier toutes ces dépendances, vous pouvez utiliser la même syntaxe que ci-dessus:
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
Est-ce que tout ce travail en vaut vraiment la peine alors que tout ce qui est nécessaire pour installer valgrind
en premier lieu est de simplement exécuter sudo apt-get install valgrind
? Si votre objectif est d'accélérer le processus de génération, vous devez également prendre en compte le temps qu'il faut pour restaurer (télécharger et extraire) le cache par rapport à simplement relancer la commande pour l'installer valgrind
.
Et enfin pour restaurer le cache, en supposant qu'il soit stocké dans /tmp/valgrind
, vous pouvez utiliser la commande:
cp --force --recursive /tmp/valgrind/* /
Ce qui copiera essentiellement tous les fichiers du cache vers la partition racine.
En plus du processus ci-dessus, j'ai également un exemple de "mise en cache de valgrind" en l'installant et en le compilant depuis la source. La taille du cache est désormais d'environ 63 Mo (compressée) et il faut encore installer séparément libc
quel type de but échoue .
Références:
Cache not found for input keys: ***.
. J'ai ajouté leVALGRIND_VERSION
secret dans Paramètres> Secrets, n'est-ce pas?--2906-- Reading syms from /lib/x86_64-linux-gnu/ld-2.27.so --2906-- Considering /lib/x86_64-linux-gnu/ld-2.27.so .. --2906-- .. CRC mismatch (computed 1b7c895e wanted 2943108a) --2906-- object doesn't have a symbol table
valgrind
en cache ait fait en sorte que lalibc
dépendance ne soit pas installée lorsque le cache est récupéré. Je ne suis pas près d'un moniteur maintenant, mais j'ai recherché votre erreur et il semble que ce soit un bug avec valgrind. Vous pouvez également essayer d'installer libc version 6 et voir si cela aide. Jesudo apt-get install -y libc6-dbg
, cela fonctionne bien, mais je suis aussi là où j'ai commencé, car l'installation de ce package prend 30 secondes de plus.Vous pouvez créer une image docker avec
valgrind
préinstallé et exécuter votre flux de travail à ce sujet.Créez un
Dockerfile
avec quelque chose comme:Construisez-le et poussez-le sur dockerhub:
Utilisez ensuite quelque chose comme ce qui suit comme flux de travail:
Complètement non testé, mais vous avez l'idée.
la source