使用GitHub Actions缓存来进行brew安装

22

我想使用GitHub Actions缓存(actions/cache@v2)来保存brew install命令的缓存,而不是一遍又一遍地重新下载所有依赖项。

这将使我的构建速度更快,我该如何实现?

2个回答

3

在你的工作流程任务配置中:

    steps:
    - name: Update Homebrew
      run: |
        brew update --preinstall
        cat "$(brew --repository)/Library/Taps/homebrew/homebrew-core/Formula/foo.rb" > .github/brew-formulae
    - name: Configure Homebrew cache
      uses: actions/cache@v2
      with:
        path: |
          ~/Library/Caches/Homebrew/foo--*
          ~/Library/Caches/Homebrew/downloads/*--foo-*
        key: brew-${{ hashFiles('.github/brew-formulae') }}
        restore-keys: brew-
    - name: Install Homebrew dependencies
      run: |
        env HOMEBREW_NO_AUTO_UPDATE=1 brew install foo

这里的~/Library/Caches/Homebrew对应于brew --cache的输出。

与将整个目录存储到GitHub Actions缓存不同,上述配置仅存储与“foo”软件包相关的文件。这是因为GitHub提供的macOS映像中的Homebrew缓存目录已经包含了基本的Homebrew安装文件(您不需要再次存储)。

请注意,此缓存不太可能加快您的工作流程。安装Homebrew Bottle(默认情况下)通常具有与从GitHub / Azure自己的存储缓存下载相似的性能,因为瓶装文件是在bintray的CDN上提供的。


一个问题:如何将此扩展到两个包?我问这个问题是因为GitHub Actions的macOS镜像最近似乎破坏了一些低级别的东西。目前我找到的唯一解决方案是对两个包执行brew reinstall --build-from-source(参见https://stackoverflow.com/a/19086854/1876449)。因此,缓存将大获全胜!我只想知道在这里需要做哪些部分来缓存两个包。我在GitHub Actions方面相当无用。我会尝试弄清楚,但像您这样的大师可能更懂! - Fortran
实际上,如果您正在使用“--build-from-source”,那么本答案中的缓存路径将不足够(因为在这种情况下,您将希望缓存瓶子或桶以防止重新编译)。我将为此情况发布本答案的更新。关于多个软件包,您可以将其他行添加到path列表和软件包到brew install命令中。 - p00ya
是的,现在我感觉很愚蠢。其实我想出了一种不同的方法: - name: 如果 MPI 没有缓存,则在 macOS 上修复 gmp 和 mpfr if: steps.cache-mpi.outputs.cache-hit != 'true' && matrix.os == 'macos-10.15' run: | brew reinstall --build-from-source gmp mpfr - Fortran
请查看示例:https://github.com/DataDog/datadog-agent-macos-build/blob/master/.github/workflows/macos.yaml#L58 - Melroy van den Berg
1
另一个使用cache-hit的例子:https://github.com/jawang35/dotfiles/blob/master/.github/workflows/ci.yml#L16 - Melroy van den Berg
它说 gtkmm3 3.x.x 已经安装,只是没有链接。 所以我在 GH Actions 中也执行了 brew link gtkmm3。但是构建仍然失败了!-- 检查模块 'gtkmm-3.0' -- 包 'giomm-2.4',由 'gtkmm-3.0' 要求,未找到 :( - Melroy van den Berg

3

这很棘手,因为actions/cache依赖于将库放置在特定文件夹中,然后可以进行缓存和检索。而系统文件具有许多依赖关系,这使得每个库在此过程中都是独特的。

以下是三个选项,可帮助您完成此操作:

路径1:

我们可以考虑将brew软件包安装到特定文件夹中,但我们不能为每个软件包执行此操作,而只能为整个操作系统执行此操作。但是根据homebrew https://github.com/Homebrew/brew/blob/664d0c67d5947605c914c4c56ebcfaa80cb6eca0/docs/Installation.md#untar-anywhere的说法,这不是一个好主意,因为可能会出现软件包无法正确安装的问题。此外,这基本上是对所有内容进行缓存,最终我们不知道它是否比仅安装所需的最新软件包更快。

路径2:

使用brew正常安装软件包,然后复制二进制文件。这里的警告是,您需要针对每个库执行此操作,因为有时依赖关系会失控。以下是一个例子:在GitHub Actions工作流中缓存APT软件包,通过在Linux中使用apt-get进行此过程,但您可以按照相同的流程操作brew。

路径3:

找到或创建自己的Docker文件镜像,并保持最新软件包同步。这将允许您始终具有最新版本,从而使您能够在从docker映像构建的容器内初始化步骤。这将满足您的系统依赖性。

 jobs:
   ci:
     runs-on: ubuntu-latest
     container:
       image: <your-personalized-docker-image>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接