APT paketlerini GitHub Actions iş akışında önbelleğe alma


9

C projem için aşağıdaki Github Eylemleri iş akışını kullanıyorum. İş akışı ~ 40 saniye içinde biter, ancak valgrindpaketin ve bağımlılıklarının yüklenmesi ile bu sürenin yarısından fazlası harcanır .

Önbelleğe almanın iş akışını hızlandırmama yardımcı olabileceğine inanıyorum. Birkaç saniye daha beklemiyorum, ama bu sadece GitHub'ın kaynaklarının anlamsız bir israfı gibi görünüyor.

name: C Workflow

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1

    - name: make
      run: make

    - name: valgrind
      run: |
        sudo apt-get install -y valgrind
        valgrind -v --leak-check=full --show-leak-kinds=all ./bin

Running sudo apt-get install -y valgrind, aşağıdaki paketleri yükler:

  • gdb
  • gdbserver
  • libbabeltrace1
  • libc6-dbg
  • libipt1
  • valgrind

Eylemler belirli bir dizinin önbelleğe almayı desteklediğini biliyorum (ve bu konuda zaten birkaç cevaplanmış SO sorusu ve makalesi var), ancak apt tarafından yüklenen tüm farklı paketlerin nerede biteceğinden emin değilim. Paketlerin yüklenmesinden etkilenen tek dizin olmadığını varsayıyorum /bin/ya /usr/bin/da değil.

Yüklü sistem paketlerini gelecekteki iş akışı çalışmaları için önbelleğe almanın zarif bir yolu var mı?

Yanıtlar:


5

Bu cevabın amacı, github eylemleriyle önbelleğe almanın nasıl yapılabileceğini göstermektir. Her zaman önbelleğin nasıl valgrindgösterileceğini göstermek değil, aynı zamanda her şeyin önbelleğe alınamayacağını / önlenmemesi gerektiğini ve bağımlılığın yeniden yüklenmesine karşı bir önbelleğin önbelleğe alınması ve geri yüklenmesinin de dikkate alınması gerektiğini göz önünde bulundurmak gerekir.


Bunu yapmak için actions/cacheeylemden yararlanacaksınız.

Bir adım olarak ekleyin (valgrind'i kullanmadan önce):

- name: Cache valgrind
  uses: actions/cache@v1.0.3
  id: cache-valgrind
  with:
      path: "~/valgrind"
      key: ${{secrets.VALGRIND_VERSION}}

Bir sonraki adım, varsa önbelleğe alınmış sürümü yüklemeye veya depolardan yüklemeye çalışmalıdır:

- 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

açıklama

VALGRIND_VERSIONSırrı çıktı olarak ayarlayın :

apt-cache policy valgrind | grep -oP '(?<=Candidate:\s)(.+)'

bu, yeni bir sürüm yayınlandığında yalnızca sırrın değerini değiştirerek önbelleği geçersiz kılmanızı sağlar.

dpkg -L valgrindkullanılırken yüklenen tüm dosyaları listelemek için kullanılır sudo apt-get install valgrind.

Şimdi bu komutla yapabileceğimiz, tüm bağımlılıkları önbellek klasörünüze kopyalamaktır:

dpkg -L valgrind | while IFS= read -r f; do if test -f $f; then echo $f; fi; done | xargs cp --parents --target-directory ~/valgrind/

ayrıca

Tüm bileşenlerini kopyalamaya ek olarak valgrind, bağımlılıkları da kopyalamak gerekebilir ( libcbu durumda olduğu gibi ), ancak bağımlılık zinciri oradan büyüdüğü için bu yol boyunca devam etmenizi önermiyorum. Kesin olmak gerekirse, nihayet valgrind'in çalışmasına uygun bir ortama sahip olmak için kopyalamak için gereken bağımlılıklar aşağıdaki gibidir:

  • libc6
  • libgcc1
  • gcc-8-baz

Tüm bu bağımlılıkları kopyalamak için yukarıdakiyle aynı sözdizimini kullanabilirsiniz:

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

valgrindİlk etapta kurmak için gereken her şey basitçe çalıştırmak olduğunda tüm bu işler gerçekten sorun çıkarmaya değer sudo apt-get install valgrindmi? Amacınız derleme işlemini hızlandırmaksa, önbelleği geri yüklemek (indirmek ve çıkarmak) için gereken süreyi de dikkate almanız gerekir.valgrind .


Ve son olarak önbelleği depolandığı varsayılarak geri yüklemek için şu /tmp/valgrindkomutu kullanabilirsiniz:

cp --force --recursive /tmp/valgrind/* /

Temel olarak önbellekten tüm dosyaları kök bölüme kopyalar.

Yukarıdaki sürece ek olarak, "önbelleğe alma valgrind" bir örnek yüklemek ve kaynağından derleyerek var. Önbellek şimdi yaklaşık 63MB (sıkıştırılmış) boyutundadır ve hala libchangi tür yenilgileri amaçlamak için ayrı olarak yüklenmesi gerekir .


Referanslar:


Anlıyorum, bu dahice. Yüklü tüm dosyaları güvenli bir şekilde alıp bir şeyleri bozmadan başka bir dizine taşıyabileceğiniz konusunda hiçbir fikrim yoktu. Yine de çalıştığından emin değilim. İş akışını 3 kez çalıştırdım ve hep gidiyorum Cache not found for input keys: ***.. VALGRIND_VERSIONSırrı Ayarlar> Sırlar'a ekledim, değil mi?
natiiix

Şimdi bir önbellek isabet almayı başardım, ancak valgrind şu hatayı alıyorum:--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
natiiix

@natiiix, önbellek valgrindalındığında libcbağımlılığın yüklenmemesi için önbelleğe alma işleminin yapılma olasılığı vardır . Şimdi bir monitöre yakın değilim, ama hatanıza baktım ve valgrind ile ilgili bir hata gibi görünüyor . Ayrıca libc sürüm 6'yı yüklemeyi deneyebilir ve bunun işe yarayıp yaramadığını görebilirsiniz. Cevabı bugün daha sonra güncelleyeceğim
smac89

Evet, öyle görünüyor. Eklersem sudo apt-get install -y libc6-dbg, o zaman iyi çalışır, ancak o zaman da başladığım yerim çünkü bu paketin yüklenmesi 30 saniye daha sürüyor.
natiiix

@natiiix Görünüşe göre önbellekleme valgrind'i beklenenden daha fazla iş olabilir, ancak en azından bu, ubuntu'da önbelleğe almanın nasıl yapılabileceğini gösterir. Valgrind'in bağımlılıklarına bakıldığında, en az 6 bağımlılık var ve bence bu işe yarayacaksa muhtemelen hepsinin önbelleğe alınması gerekiyor.
smac89

5

valgrindÖnceden yüklenmiş olarak bir liman işçisi görüntüsü oluşturabilir ve iş akışınızı bunun üzerinde çalıştırabilirsiniz.

Şunun Dockerfilegibi bir şeyle bir oluşturun :

FROM ubuntu

RUN apt-get install -y valgrind

Oluşturun ve dockerhub'a itin:

docker build -t natiiix/valgrind .
docker push natiiix/valgrind

Ardından iş akışınız olarak aşağıdakine benzer bir şey kullanın:

name: C Workflow

on: [push, pull_request]

jobs:
  build:
    container: natiiix/valgrind

    steps:
    - uses: actions/checkout@v1

    - name: make
      run: make

    - name: valgrind
      run: valgrind -v --leak-check=full --show-leak-kinds=all ./bin

Tamamen denenmemiş, ama fikri anladınız.


Bu çok ilginç bir fikir, ancak GitHub Eylemlerinin çevreyi / yapay nesneleri gelecekteki çalışmalar için önbelleğe almasına izin verme prensibini zayıflatıyor ve bunun yerine benim tarafımdan biraz çaba gerektiriyor. Öte yandan, bir kez yapıldığında, bu muhtemelen oldukça kolay bir şekilde yeniden kullanılabilir.
natiiix

1
Sizin için neyin en iyi olduğuna ya da sizin tarafınızdan en fazla rahatsızlığı gerektiren şeylere karar vermek size bağlıdır ¯_ (ツ) _ / ¯
deivid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.