Celem tej odpowiedzi jest pokazanie, w jaki sposób buforowanie można wykonać za pomocą akcji github. Niekoniecznie musi pokazywać, jak buforować valgrind, co pokazuje, ale także, aby pokazać, że nie wszystko można / należy buforować, i należy wziąć pod uwagę kompromisy buforowania i przywracania bufora w porównaniu z ponowną instalacją zależności.
Wykorzystasz actions/cache akcji.
Dodaj go jako krok (zanim będziesz musiał użyć valgrind):
- name: Cache valgrind
uses: actions/cache@v1.0.3
id: cache-valgrind
with:
path: "~/valgrind"
key: ${{secrets.VALGRIND_VERSION}}
Następnym krokiem powinna być próba zainstalowania wersji buforowanej, jeśli taka istnieje, lub instalacji z repozytoriów:
- 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
Wyjaśnienie
Ustaw VALGRIND_VERSIONsekret jako wynik:
apt-cache policy valgrind | grep -oP '(?<=Candidate:\s)(.+)'
pozwoli to unieważnić pamięć podręczną po wydaniu nowej wersji, zmieniając po prostu wartość tajnego klucza.
dpkg -L valgrindsłuży do wyświetlenia listy wszystkich plików zainstalowanych podczas używania sudo apt-get install valgrind.
To, co możemy teraz zrobić za pomocą tego polecenia, to skopiować wszystkie zależności do naszego folderu pamięci podręcznej:
dpkg -L valgrind | while IFS= read -r f; do if test -f $f; then echo $f; fi; done | xargs cp --parents --target-directory ~/valgrind/
Ponadto
Oprócz skopiowania wszystkich składników valgrindmoże być również konieczne skopiowanie zależności (tak jak libcw tym przypadku), ale nie zalecam kontynuowania tej ścieżki, ponieważ łańcuch zależności po prostu rośnie. Mówiąc ściślej, zależności potrzebne do skopiowania, aby ostatecznie stworzyć środowisko odpowiednie dla valgrinda, są następujące:
Aby skopiować wszystkie te zależności, możesz użyć tej samej składni jak powyżej:
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
Czy cała ta praca naprawdę jest warta kłopotów, gdy wszystko, co jest wymagane do zainstalowania, valgrindto po prostu uruchomienie sudo apt-get install valgrind? Jeśli Twoim celem jest przyspieszenie procesu kompilacji, musisz również wziąć pod uwagę czas potrzebny do przywrócenia (pobierania i rozpakowywania) pamięci podręcznej w porównaniu z ponownym uruchomieniem polecenia, aby zainstalować valgrind.
Na koniec, aby przywrócić pamięć podręczną, zakładając, że jest ona przechowywana /tmp/valgrind, możesz użyć polecenia:
cp --force --recursive /tmp/valgrind/* /
Który w zasadzie skopiuje wszystkie pliki z pamięci podręcznej na partycję główną.
Oprócz powyższego procesu mam również przykład „buforowania valgrind” poprzez instalację i kompilację ze źródła. Pamięć podręczna ma teraz rozmiar około 63 MB (skompresowany) i nadal trzeba osobno zainstalować, libcktóry rodzaj tego celu nie spełnia .
Bibliografia:
Cache not found for input keys: ***.. DodałemVALGRIND_VERSIONsekret w Ustawieniach> Sekrety, prawda?