O objetivo desta resposta é mostrar como o cache pode ser feito com ações do github. Não necessariamente para mostrar como armazenar em cache valgrind
, o que mostra, mas também para mostrar que nem tudo pode / deve ser armazenado em cache, e as vantagens e desvantagens de armazenar em cache e restaurar um cache versus reinstalar a dependência precisam ser levadas em consideração.
Você fará uso da actions/cache
ação para fazer isso.
Adicione-o como uma etapa (antes de precisar usar o valgrind):
- name: Cache valgrind
uses: actions/[email protected]
id: cache-valgrind
with:
path: "~/valgrind"
key: ${{secrets.VALGRIND_VERSION}}
A próxima etapa deve tentar instalar a versão em cache, se houver, ou instalar a partir dos repositórios:
- 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
Explicação
Defina VALGRIND_VERSION
segredo para ser a saída de:
apt-cache policy valgrind | grep -oP '(?<=Candidate:\s)(.+)'
isso permitirá que você invalide o cache quando uma nova versão for lançada simplesmente alterando o valor do segredo.
dpkg -L valgrind
é usado para listar todos os arquivos instalados ao usar sudo apt-get install valgrind
.
O que podemos agora fazer com este comando é copiar todas as dependências para nossa pasta de 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/
além disso
Além de copiar todos os componentes de valgrind
, também pode ser necessário copiar as dependências (como libc
neste caso), mas não recomendo continuar nesse caminho porque a cadeia de dependências cresce a partir daí. Para ser preciso, as dependências necessárias para copiar para finalmente ter um ambiente adequado para execução do valgrind são as seguintes:
Para copiar todas essas dependências, você pode usar a mesma sintaxe que acima:
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 esse trabalho realmente vale a pena quando tudo o que é necessário para instalar valgrind
em primeiro lugar é simplesmente executar sudo apt-get install valgrind
? Se seu objetivo é acelerar o processo de compilação, também é necessário levar em consideração a quantidade de tempo que leva para restaurar (baixar e extrair) o cache e simplesmente executar o comando novamente para instalar valgrind
.
E, finalmente, para restaurar o cache, assumindo que ele esteja armazenado em /tmp/valgrind
, você pode usar o comando:
cp --force --recursive /tmp/valgrind/* /
O que basicamente copiará todos os arquivos do cache para a partição raiz.
Além do processo acima, também tenho um exemplo de "cache valgrind" instalando e compilando-o da fonte. O cache agora tem cerca de 63 MB (compactado) de tamanho e ainda é necessário instalar separadamente, libc
que derruba o objetivo.
Referências:
Cache not found for input keys: ***.
. Eu adicionei oVALGRIND_VERSION
segredo em Configurações> Segredos, está certo?--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
feito com que alibc
dependência não seja instalada quando o cache for recuperado. Não estou perto de um monitor agora, mas procurei seu erro e parece que é um bug do valgrind. Você também pode tentar instalar a libc versão 6 e ver se isso ajuda. Atualizarei a resposta hoje mais tardesudo apt-get install -y libc6-dbg
, ele funcionará bem, mas também estou onde comecei porque a instalação desse pacote leva mais 30 segundos.Você pode criar uma imagem de janela de encaixe
valgrind
pré - instalada e executar seu fluxo de trabalho nela.Crie um
Dockerfile
com algo como:Construa-o e envie-o para o dockerhub:
Em seguida, use algo como o seguinte como seu fluxo de trabalho:
Completamente não testado, mas você entendeu.
fonte