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

2024-01-11

我对我的 C 项目使用以下 Github Actions 工作流程。工作流程在约 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

Running sudo apt-get install -y valgrind安装以下软件包:

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

我知道 Actions 支持缓存特定目录(并且已经有几个已回答的 SO 问题和有关此的文章),但我不确定 apt 安装的所有不同软件包最终都在哪里。我假设/bin/ or /usr/bin/不是唯一受安装包影响的目录。

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


这个答案的目的是展示如何使用 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运行的环境需要复制的依赖如下:

  • 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/* /

这基本上会将所有文件从缓存复制到根分区。

除了上面的流程之外,我还有一个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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 GitHub Actions 工作流程中缓存 APT 包 的相关文章

随机推荐

  • NETSDK1073:无法识别 FrameworkReference“Microsoft.AspNetCore.App”

    我使用 NET Core 5 0 100 preview 7 20366 6 Blazor webassemble Microsoft Visual Studio Community 2019 预览版 16 7 0 预览版 6 0 file
  • 在 Actionscript 上播放声音

    我有一个简单的拖放游戏 在 Flash 中启动并且大部分工作正常 我已经添加了我的动物 您可以将它们拖放到正确的位置 我还添加了声音 这样当动物被放到正确的位置时 它就可以工作 但是每次我将新动物添加到正确的位置时 它都会起作用 播放那个声
  • Objective-C 中的 NSBundle 和 mainBundle 是什么?

    关于iOS上的Objective C应用程序 我在Apple开发者网站上阅读了一些示例程序 我发现几乎所有的应用程序都包含一个词叫做 NSBundle https developer apple com documentation foun
  • 使用时间跨度对具有相同值的连续行进行分组

    抱歉标题含糊 我只是不知道如何描述这个难题 给出一个教室的时间表如下 Classroom CourseName Lesson StartTime EndTime 1001 Course 1 Lesson 1 0800 0900 1001 C
  • 在 ASP.NET 中发送大量电子邮件

    这是我发送大量电子邮件的代码 我想优化此代码以确保它能够正常工作并且可以成功发送所有电子邮件 我应该怎么办 我知道在发送之间设置中断可能很有用 但我该怎么做呢 主要问题是避免将电子邮件分类为垃圾邮件并减少发送失败的电子邮件数量 var li
  • 使用 Chrome Identity API 获取 id_token

    我正在开发一个 Google Chrome 扩展程序 以允许用户使用他们的 Google 帐户进行身份验证 我决定使用Chrome Identity API 要对我的应用程序中的用户进行身份验证 我需要获取 ID Token 签名令牌 有没
  • 未捕获的类型错误:无法读取 null 的属性“on”[重复]

    这个问题在这里已经有答案了 我收到这个未捕获的类型错误 我不确定是什么原因造成的 也许与 JQuery 有关 这是确切的代码 when add to cart link is clicked addtocart on click funct
  • 使用 javascript 将外部 .htm 文件加载到 div 中

    所以我得到了这个代码 JavaScript html a href file htm class ajax Link a 它在 Firefox 中完美运行 但是当我在 Chrome 中单击链接时 什么也没有发生 而 IE 只是打开一个包含该
  • R 中的 padr:以用户定义的间隔进行填充

    我正在以 5 分钟的时间间隔处理时间序列数据 部分 5 分钟时间序列缺失 我想对数据集重新采样 以用 NaN 值填充缺失的 5 分钟时间段 我在这里找到了有关如何解决此问题的大量信息 R 插入缺少日期 时间的行 https stackove
  • 在数组中查找几个感兴趣的区域

    假设我进行了一项实验 其中我让 python 程序运行了很长一段时间 在那段时间里 我对一些数量与时间的关系进行了多次测量 每次测量都以 1 到 3 秒之间的某个值分隔 所使用的时间步长比该值小得多 比如 0 01 秒 即使只取 y 轴 这
  • 使用 FFmpeg 中的 libavcodec 解码作品

    我正在尝试使用 libavcodec 解码作品 我可以单独使用 libopus 库来做到这一点 但我正在尝试使用 libavcodec 实现相同的目标 我试图弄清楚为什么它在我的情况下不起作用 我有一个 rtp 流并尝试对其进行解码 解码数
  • 在 Google Cloud Vision API 中指定响应语言

    我正在使用 Google Cloud Vision API 来检测给定图像中的地标 网络实体和其他内容 查看文档here https cloud google com vision docs libraries 我专门使用 images a
  • C# 选择列表中的元素作为字符串列表

    在 C 中 我需要将对象列表中特定属性的所有值获取到字符串列表中 List
  • 更改 ViewModel 的视图

    我正在尝试为 mt WPF 应用程序实现 MVVM 设计模式 为了将视图连接到视图模型 我使用ResourceDictionary 用于Application Resources 看起来像
  • StandardOpenOption.SPARSE 有什么用?

    Java 7 定义这个选项 http docs oracle com javase 7 docs api java nio file StandardOpenOption html SPARSE 但我无法理解它的用处 考虑这个简单的程序 在
  • Sql Server 2005 与 Windows 10 不兼容

    当我升级到 Windows 10 时 SQL Server 2005 可以工作 现在它无法工作 据 Microsoft 称 我读到它与 Windows 8 不兼容 对我来说 Windows 10 只是 Windows 8 的成熟版本 有什么
  • Scala Playframework 发送文件

    我有一串数据 是从数据库中的数据中获取的 我想将其发送给用户 但不创建文件的本地副本 例如 Ok MyString as file csv 但它不起作用 我该怎么做 您可以通过使用来做到这一点chunked与Enumerator 我也用过w
  • 触发 PHP 处理

    I ask a 类似的问题 https stackoverflow com q 5964407 2246380昨天 但这一切都变得令人困惑 我想我应该重新开始并尝试更好地解释它 我即将设计一个拍卖网站 与 eBay 非常相似 物品从 24
  • 表单验证和表单助手

    我仍然在 Play 2 0 中的表单验证和表单助手方面遇到困难 我有一个与 Twitter Bootstrap 一起使用的登录屏幕 所以我的登录表单如下所示 helper form routes Application authentica
  • 在 GitHub Actions 工作流程中缓存 APT 包

    我对我的 C 项目使用以下 Github Actions 工作流程 工作流程在约 40 秒内完成 但其中一半以上的时间都花在安装valgrind包及其依赖项 我相信缓存可以帮助我加快工作流程 我不介意多等几秒钟 但这似乎是对 GitHub