这个答案的目的是展示如何使用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
secret 设置为以下内容的输出:
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” 的示例。现在,高速缓存的大小约为63MB(压缩),仍然需要单独安装libc
以达到目的。
参考文献:
Cache not found for input keys: ***.
。我VALGRIND_VERSION
在设置>机密中添加了机密,对吗?