Цель этого ответа - показать, как можно выполнять кэширование с помощью действий 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, выглядят следующим образом:
Чтобы скопировать все эти зависимости, вы можете использовать тот же синтаксис, что и выше:
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/* /
Который будет в основном копировать все файлы из кэша в корневой раздел.
В дополнение к процессу выше, у меня также есть пример «кэширования valgrind» путем его установки и компиляции из исходного кода. Размер кэша теперь составляет около 63 МБ (сжатого), и все еще необходимо отдельно установить, libc
какой тип поражения цели.
Ссылки:
Cache not found for input keys: ***.
. Я добавилVALGRIND_VERSION
секрет в Настройки> Секреты, это правда?--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
сделало так, чтобыlibc
при извлечении кэша зависимость не устанавливалась. Сейчас я не рядом с монитором, но я посмотрел вашу ошибку, и похоже, что это ошибка в valgrind. Вы также можете попробовать установить libc версии 6 и посмотреть, поможет ли это. Яsudo apt-get install -y libc6-dbg
, то все будет работать нормально, но я тоже с того, что начал, потому что установка этого пакета занимает еще 30 секунд.Вы можете создать образ докера с
valgrind
предустановленным и запустить рабочий процесс на этом.Создайте
Dockerfile
что-то вроде:Постройте его и отправьте в dockerhub:
Затем используйте что-то вроде следующего в качестве рабочего процесса:
Полностью не проверено, но вы поняли идею.
источник