Мета цієї відповіді - показати, як кешування можна виконати з діями github. Не обов’язково показувати, як кешувати valgrind
, що він показує, але також показувати, що не все можна / слід кешувати, а компроміси кешування та відновлення кешу та перевстановлення залежності потрібно враховувати.
Для цього ви скористаєтесь actions/cache
діями.
Додайте його як крок (перед тим, як використовувати valgrind):
- name: Cache valgrind
uses: actions/cache@v1.0.3
id: cache-valgrind
with:
path: "~/valgrind"
key: ${{secrets.VALGRIND_VERSION}}
Наступним кроком слід спробувати встановити кешовану версію, якщо така є, або встановити з сховищ:
- 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
Пояснення
Встановіть VALGRIND_VERSION
секрет як вихід:
apt-cache policy valgrind | grep -oP '(?<=Candidate:\s)(.+)'
це дозволить вам визнати недійсним кеш, коли випущена нова версія, просто змінивши значення секрету.
dpkg -L valgrind
використовується для списку всіх встановлених файлів при використанні sudo apt-get install valgrind
.
Тепер ми можемо скористатися цією командою - скопіювати всі залежності в нашу папку кешу:
dpkg -L valgrind | while IFS= read -r f; do if test -f $f; then echo $f; fi; done | xargs cp --parents --target-directory ~/valgrind/
Крім того
На додаток до копіювання всіх компонентів valgrind
, можливо, також буде потрібно копіювати залежності (наприклад, libc
у цьому випадку), але я не рекомендую продовжувати цей шлях, оскільки ланцюг залежностей просто зростає звідти. Якщо бути точним, залежності, необхідні для копіювання, щоб нарешті створити середовище, придатне для запуску valgrind, є таким:
- libc6
- libgcc1
- gcc-8-основа
Щоб скопіювати всі ці залежності, ви можете використовувати той же синтаксис, що і вище:
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
в першу чергу - це просто запустити sudo apt-get install valgrind
? Якщо ваша мета - прискорити процес збирання, то вам також доведеться враховувати кількість часу, необхідного для відновлення (завантаження та вилучення) кешу, а також просто запустити команду знову для встановлення valgrind
.
І нарешті, щоб відновити кеш, припускаючи, що він зберігається в /tmp/valgrind
, ви можете використовувати команду:
cp --force --recursive /tmp/valgrind/* /
Що в основному буде копіювати всі файли з кеша до кореневого розділу.
Окрім вищезазначеного процесу, я також маю приклад "кешування вальгринду" шляхом встановлення та компіляції з джерела. Зараз кеш має розмір приблизно 63 Мб (стислий), і все одно потрібно окремо встановити, libc
який тип перемагає призначення.
Список літератури:
Cache not found for input keys: ***.
. Я додавVALGRIND_VERSION
секрет у Налаштуваннях> Секрети, правда?