Tujuan dari jawaban ini adalah untuk menunjukkan bagaimana caching dapat dilakukan dengan tindakan github. Tidak harus menunjukkan cara cache valgrind
, yang ditampilkan, tetapi juga untuk menunjukkan bahwa tidak semuanya bisa / harus di-cache, dan timbal balik dari cache dan memulihkan cache vs menginstal ulang ketergantungan perlu diperhitungkan.
Anda akan menggunakan actions/cache
tindakan untuk melakukan ini.
Tambahkan sebagai langkah (sebelum Anda perlu menggunakan valgrind):
- name: Cache valgrind
uses: actions/[email protected]
id: cache-valgrind
with:
path: "~/valgrind"
key: ${{secrets.VALGRIND_VERSION}}
Langkah selanjutnya harus mencoba untuk menginstal versi yang di-cache jika ada atau menginstal dari repositori:
- 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
Penjelasan
Set VALGRIND_VERSION
rahasia untuk menjadi hasil dari:
apt-cache policy valgrind | grep -oP '(?<=Candidate:\s)(.+)'
ini akan memungkinkan Anda untuk membatalkan cache ketika versi baru dirilis hanya dengan mengubah nilai rahasianya.
dpkg -L valgrind
digunakan untuk membuat daftar semua file yang diinstal saat menggunakan sudo apt-get install valgrind
.
Apa yang sekarang dapat kita lakukan dengan perintah ini adalah menyalin semua dependensi ke folder cache kita:
dpkg -L valgrind | while IFS= read -r f; do if test -f $f; then echo $f; fi; done | xargs cp --parents --target-directory ~/valgrind/
Selanjutnya
Selain menyalin semua komponen valgrind
, mungkin juga perlu menyalin dependensi (seperti libc
dalam kasus ini), tetapi saya tidak menyarankan melanjutkan sepanjang jalur ini karena rantai ketergantungan hanya tumbuh dari sana. Tepatnya, dependensi yang diperlukan untuk menyalin untuk akhirnya memiliki lingkungan yang cocok untuk dijalankan valgrind adalah sebagai berikut:
Untuk menyalin semua dependensi ini, Anda dapat menggunakan sintaks yang sama seperti di atas:
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
Apakah semua pekerjaan ini benar-benar layak masalah ketika semua yang diperlukan untuk menginstal valgrind
di tempat pertama adalah menjalankannya sudo apt-get install valgrind
? Jika tujuan Anda adalah untuk mempercepat proses pembuatan, maka Anda juga harus mempertimbangkan jumlah waktu yang diperlukan untuk memulihkan (mengunduh, dan mengekstrak) cache vs. hanya menjalankan perintah lagi untuk menginstal valgrind
.
Dan akhirnya untuk mengembalikan cache, dengan anggapan disimpan /tmp/valgrind
, Anda dapat menggunakan perintah:
cp --force --recursive /tmp/valgrind/* /
Yang pada dasarnya akan menyalin semua file dari cache ke partisi root.
Selain proses di atas, saya juga punya contoh "caching valgrind" dengan menginstal dan mengkompilasinya dari sumber. Cache sekarang sekitar 63MB (terkompresi) dalam ukuran dan satu masih perlu menginstal secara terpisah libc
jenis yang mengalahkan tujuannya.
Referensi:
Cache not found for input keys: ***.
. Saya menambahkanVALGRIND_VERSION
rahasia di Pengaturan> Rahasia, benarkah itu?--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
dibuat sehinggalibc
ketergantungan tidak diinstal ketika cache diambil. Saya tidak berada di dekat monitor sekarang, tetapi saya mencari kesalahan Anda dan sepertinya itu adalah bug dengan valgrind. Anda dapat mencoba juga menginstal libc versi 6 dan melihat apakah itu membantu. Saya akan memperbarui jawabannya hari inisudo apt-get install -y libc6-dbg
, maka itu berfungsi dengan baik, tapi kemudian saya juga di mana saya mulai karena instalasi paket itu membutuhkan waktu 30 detik lebih.Anda bisa membuat gambar buruh pelabuhan dengan
valgrind
pra - instal dan menjalankan alur kerja Anda di situ.Buat
Dockerfile
dengan sesuatu seperti:Bangun dan dorong ke dockerhub:
Kemudian gunakan sesuatu seperti berikut ini sebagai alur kerja Anda:
Benar-benar belum diuji, tetapi Anda mendapatkan idenya.
sumber