【发布时间】:2020-12-19 15:42:52
【问题描述】:
我想使用 GitHub Actions 缓存 (actions/cache@v2) 来保存我的 brew install 命令的缓存,而不是一遍又一遍地重新下载所有依赖项。
这将使我的构建速度更快,我该如何实现?
【问题讨论】:
标签: macos homebrew github-actions
我想使用 GitHub Actions 缓存 (actions/cache@v2) 来保存我的 brew install 命令的缓存,而不是一遍又一遍地重新下载所有依赖项。
这将使我的构建速度更快,我该如何实现?
【问题讨论】:
标签: macos homebrew github-actions
这很棘手,因为操作/缓存取决于您将库放在特定文件夹中,然后可以缓存和检索。并且系统文件有很多依赖关系,这使得每个库在这个过程中都是独一无二的。
您可以采取以下三个选项来完成此操作
路径 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>
【讨论】:
在您的工作流作业配置中:
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 上提供的。
【讨论】:
brew reinstall --build-from-source(参见stackoverflow.com/a/19086854/1876449)。因此,缓存将大获全胜!我只想知道在这里我可能需要做些什么来缓存两个包。我在 GitHub Actions 上相当没用。我会试着弄清楚,但像你这样的大师可能更清楚!
--build-from-source,那么此答案中的缓存路径将不够用(因为在这种情况下,您需要缓存瓶子或小桶以防止重新编译)。对于这种情况,我将发布对此答案的更新。对于多个包,您只需将附加行添加到path 列表,将包添加到brew install 命令。
cache-hit的例子:github.com/jawang35/dotfiles/blob/master/.github/workflows/…