【问题标题】:Use GitHub actions cache with brew install通过 brew install 使用 GitHub 操作缓存
【发布时间】:2020-12-19 15:42:52
【问题描述】:

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

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

【问题讨论】:

    标签: macos homebrew github-actions


    【解决方案1】:

    这很棘手,因为操作/缓存取决于您将库放在特定文件夹中,然后可以缓存和检索。并且系统文件有很多依赖关系,这使得每个库在这个过程中都是独一无二的。

    您可以采取以下三个选项来完成此操作

    路径 1:

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

    路径 2:

    像往常一样使用 brew 安装软件包,然后复制二进制文件。这里需要注意的是,您需要在每个库的基础上执行此操作,因为有时依赖关系可能会失控。 这是一个例子Caching APT packages in GitHub Actions workflow 通过在 linux 中使用 apt-get 完成此过程,但您可以使用 brew 遵循相同的过程

    路径 3:

    查找或创建您自己的 docker 文件映像,您可以在其中更新您想要的最新软件包。这将允许您始终拥有最新的,这将允许您从 docker 映像初始化容器构建中的步骤。这将满足您的系统依赖性。

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

    【讨论】:

      【解决方案2】:

      在您的工作流作业配置中:

          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 瓶(默认)通常与从 GitHub/Azure 自己的存储缓存下载类似的性能,因为瓶文件是在 bintray 的 CDN 上提供的。

      【讨论】:

      • 一个查询:如何将其扩展到两个包?我问是因为 GitHub Actions 的 macOS 图像最近似乎破坏了一些低级的东西。我现在找到的唯一解决方案是对两个包进行brew reinstall --build-from-source(参见stackoverflow.com/a/19086854/1876449)。因此,缓存将大获全胜!我只想知道在这里我可能需要做些什么来缓存两个包。我在 GitHub Actions 上相当没用。我会试着弄清楚,但像你这样的大师可能更清楚!
      • 实际上,如果您使用的是--build-from-source,那么此答案中的缓存路径将不够用(因为在这种情况下,您需要缓存瓶子或小桶以防止重新编译)。对于这种情况,我将发布对此答案的更新。对于多个包,您只需将附加行添加到path 列表,将包添加到brew install 命令。
      • 是的。我现在觉得很傻。实际上,我想出了一种不同的方法:``` - name: Fix gmp and mpfr on macOS if MPI is not cache if: steps.cache-mpi.outputs.cache-hit != 'true' && matrix.os = = 'macos-10.15' 运行:| brew reinstall --build-from-source gmp mpfr ```
      猜你喜欢
      • 1970-01-01
      • 2022-07-12
      • 2021-01-21
      • 1970-01-01
      • 2020-03-26
      • 2015-06-16
      • 1970-01-01
      • 2021-10-06
      相关资源
      最近更新 更多