El propósito de esta respuesta es mostrar cómo se puede hacer el almacenamiento en caché con acciones de github. No necesariamente para mostrar cómo almacenar en caché valgrind
, lo que sí muestra, sino también para mostrar que no todo puede / debe almacenarse en caché, y las compensaciones del almacenamiento en caché y la restauración de un caché frente a la reinstalación de la dependencia deben tenerse en cuenta.
Harás uso de la actions/cache
acción para hacer esto.
Añádalo como un paso (antes de que necesite usar valgrind):
- name: Cache valgrind
uses: actions/[email protected]
id: cache-valgrind
with:
path: "~/valgrind"
key: ${{secrets.VALGRIND_VERSION}}
El siguiente paso debe intentar instalar la versión en caché, si la hay, o instalar desde los repositorios:
- 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
Explicación
Establecer VALGRIND_VERSION
secreto para ser la salida de:
apt-cache policy valgrind | grep -oP '(?<=Candidate:\s)(.+)'
esto le permitirá invalidar el caché cuando se lance una nueva versión simplemente cambiando el valor del secreto.
dpkg -L valgrind
se usa para enumerar todos los archivos instalados cuando se usa sudo apt-get install valgrind
.
Lo que ahora podemos hacer con este comando es copiar todas las dependencias a nuestra carpeta de caché:
dpkg -L valgrind | while IFS= read -r f; do if test -f $f; then echo $f; fi; done | xargs cp --parents --target-directory ~/valgrind/
además
Además de copiar todos los componentes de valgrind
, también puede ser necesario copiar las dependencias (como libc
en este caso), pero no recomiendo continuar a lo largo de esta ruta porque la cadena de dependencia simplemente crece a partir de ahí. Para ser precisos, las dependencias necesarias para copiar para finalmente tener un entorno adecuado para que valgrind se ejecute son las siguientes:
Para copiar todas estas dependencias, puede usar la misma sintaxis que la anterior:
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
¿Todo este trabajo realmente vale la pena cuando todo lo que se requiere para instalar valgrind
en primer lugar es simplemente ejecutar sudo apt-get install valgrind
? Si su objetivo es acelerar el proceso de compilación, también debe tener en cuenta la cantidad de tiempo que lleva restaurar (descargar y extraer) el caché en lugar de simplemente ejecutar el comando nuevamente para instalar valgrind
.
Y finalmente para restaurar el caché, suponiendo que esté almacenado en /tmp/valgrind
, puede usar el comando:
cp --force --recursive /tmp/valgrind/* /
Que básicamente copiará todos los archivos del caché a la partición raíz.
Además del proceso anterior, también tengo un ejemplo de "almacenamiento en caché de valgrind" al instalarlo y compilarlo desde la fuente. El caché ahora tiene un tamaño de aproximadamente 63 MB (comprimido) y aún se necesita instalar por separado libc
qué tipo de objetivo falla .
Referencias
Cache not found for input keys: ***.
. Agregué elVALGRIND_VERSION
secreto en Configuración> Secretos, ¿es así?--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
haga de modo que lalibc
dependencia no se instale cuando se recupere el caché. Ahora no estoy cerca de un monitor, pero busqué su error y parece que es un error con valgrind. También puede intentar instalar libc versión 6 y ver si eso ayuda. Actualizaré la respuesta más tarde hoysudo apt-get install -y libc6-dbg
, entonces funciona bien, pero también estoy donde comencé porque la instalación de ese paquete tarda 30 segundos más.Puede crear una imagen acoplable con
valgrind
preinstalado y ejecutar su flujo de trabajo en eso.Crea un
Dockerfile
con algo como:Construirlo y empujarlo a dockerhub:
Luego use algo como lo siguiente como flujo de trabajo:
Completamente no probado, pero entiendes la idea.
fuente