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/[email protected]
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_VERSION
sekret 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 valgrind
sł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 valgrind
może być również konieczne skopiowanie zależności (tak jak libc
w 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, valgrind
to 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ć, libc
który rodzaj tego celu nie spełnia .
Bibliografia:
Cache not found for input keys: ***.
. DodałemVALGRIND_VERSION
sekret w Ustawieniach> Sekrety, prawda?--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
sprawiło, żelibc
zależność nie jest instalowana podczas pobierania pamięci podręcznej. Nie jestem teraz w pobliżu monitora, ale sprawdziłem twój błąd i wygląda na to, że jest to błąd w valgrind. Możesz także spróbować zainstalować libc w wersji 6 i sprawdzić, czy to pomoże. Zaktualizuję odpowiedź później dzisiajsudo apt-get install -y libc6-dbg
, to działa dobrze, ale potem też zacząłem, ponieważ instalacja tego pakietu zajmuje 30 sekund.Możesz utworzyć obraz dokera z
valgrind
preinstalowanym i uruchomić na nim przepływ pracy.Utwórz
Dockerfile
z czymś takim jak:Zbuduj go i prześlij do dockerhub:
Następnie jako przepływu pracy użyj czegoś takiego:
Całkowicie niesprawdzone, ale masz pomysł.
źródło