在GitHub Actions工作流程中缓存APT软件包


9

我将以下Github Actions工作流程用于我的C项目。工作流在约40秒内完成,但是其中一半以上的时间是通过安装valgrind软件包及其依赖项来完成的。

我相信缓存可以帮助我加快工作流程。我不介意再等几秒钟,但这似乎对GitHub资源毫无意义的浪费。

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

运行sudo apt-get install -y valgrind将安装以下软件包:

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

我知道Actions支持特定目录的缓存(并且已经有关于此问题的一些解答之类的文章),但是我不确定apt安装的所有不同软件包的最终结果。我假设/bin//usr/bin/不是受安装软件包影响的唯一目录。

是否有一种优雅的方法可以缓存已安装的系统软件包以供将来的工作流运行?

Answers:


5

这个答案的目的是展示如何使用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_VERSIONsecret 设置为以下内容的输出:

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-base

要复制所有这些依赖项,可以使用与上面相同的语法:

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以达到目的。


参考文献:


哦,我知道,这很巧妙。我不知道您可以安全地获取所有已安装的文件,然后将它们移动到另一个目录而不会破坏某些内容。我不确定它是否有效。我将工作流程运行了3次,并且始终执行Cache not found for input keys: ***.。我VALGRIND_VERSION在设置>机密中添加了机密,对吗?
natiiix

我现在设法命中了一个高速缓存,但是我从valgrind中收到以下错误:--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存在缓存的可能性,valgrind因此libc在检索缓存时不会安装依赖项。我现在不在显示器旁边,但是我查了一下您的错误,看来这是valgrind 的错误。您也可以尝试安装libc版本6,看看是否有帮助。我将在今天晚些时候更新答案
smac89 '19

是的,看起来是这样。如果我添加sudo apt-get install -y libc6-dbg,那么它可以正常工作,但是我也是从这里开始的,因为该软件包的安装还需要30秒。
natiiix

@natiiix似乎缓存valgrind的工作可能比预期的要多,但这至少说明了如何在ubuntu上进行缓存。查看valgrind的依赖项,至少有6个依赖项,我认为它们可能都需要进行缓存才能正常工作。
smac89

4

您可以创建一个valgrind预安装的Docker映像并在其上运行工作流。

用以下内容创建一个Dockerfile

FROM ubuntu

RUN apt-get install -y valgrind

编译并将其推送到dockerhub:

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

然后,将以下内容用作您的工作流程:

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

完全未经测试,但您明白了。


这是一个非常有趣的想法,但是它破坏了让GitHub Actions缓存环境/工件以供将来运行的整个原理,而这需要我这方面的额外努力。另一方面,一旦完成,就可以很容易地重用它。
natiiix

1
它是由你来决定什么最适合你,或者是需要从你身边最offort _(ツ)_ /¯
deivid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.