这个答案的目的是展示如何使用 github actions 来完成缓存,而不一定是展示如何缓存valgrind
,(确实如此)。我还尝试解释为什么不是所有内容都可以/应该缓存,因为需要考虑缓存和恢复缓存的成本(就时间而言)以及重新安装依赖项。
您将利用actions/cache https://github.com/actions/cache采取行动来做到这一点。
将其添加为一个步骤(在需要使用 valgrind 之前):
- name: Cache valgrind
uses: actions/cache@v2
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
解释
Set 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/* /
这基本上会将所有文件从缓存复制到根分区。
除了上面的流程之外,我还有一个example https://github.com/smac89/gh-actions-samples/blob/7cc8c2d185e73b66fb75dcb50d92aff923c5983c/.github/workflows/cache_deps_ubuntu.yml通过从源代码安装和编译“缓存 valgrind”。目前缓存大小约为 63MB(压缩后),仍需要单独安装libc
这违背了目的。
注:另一个answer https://stackoverflow.com/a/60920684/2089675对于这个问题,我提出了一种更安全的缓存依赖项的方法,即使用预先安装了依赖项的容器。最好的部分是您可以使用操作来使这些容器保持最新。
参考:
- https://askubuntu.com/a/408785 https://askubuntu.com/a/408785
- https://unix.stackexchange.com/questions/83593/copy-specific-file-type-keeping-the-folder-struct https://unix.stackexchange.com/questions/83593/copy-specific-file-type-keeping-the-folder-structure