在Travis CI上缓存Homebrew瓶子和配方

时间:2018-05-06 06:05:14

标签: homebrew travis-ci

我需要通过Brew安装比Travis CI映像中包含的更新版本的依赖项。运行brew update为每个构建作业添加超过100秒,因此我想找到一种方法来缓存安装,或者至少缓存瓶子和公式。

似乎应该有一个简单的配方来缓存Brew中的瓶子和配方,但到目前为止我还没有找到配方。

具体来说,我在TravisCI上使用pyenv,对于使用Python 2.6运行测试的构建作业,我需要pyenv作为最新版本(1.2.4),由于最近对PyPI的更改,get_pip在早期版本上失败。

我为.travis.yml添加了一个条件,它运行正常:

if [[ "$pyver" == 2.6 ]]; then
  brew upgrade pyenv &>/dev/null
fi

但是,该命令需要一段时间才能运行。我已经拆分升级命令并计时:

time brew update
time brew upgrade pyenv

brew update需要超过100秒,brew upgrade需要10秒。

这一发现导致了缓存瓶子和公式以及每次后续构建运行的想法:

HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade pyenv

关于如何cache Brew sources的问题。这很好。

cache:
  directories:
    - "$HOME/Library/Caches/Homebrew"

$HOME/Library/Caches/Homebrew中,我发现瓶子被缓存了:

pyenv-1.1.5.sierra.bottle.tar.gz
pyenv-1.2.4.sierra.bottle.tar.gz

然而,即使缓存瓶子,运行HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade pyenv也不会成功,大概是因为更新的公式没有被缓存。该命令产生:

Error: pyenv 1.1.5 already installed

我添加了公式的缓存:

cache:
  directories:
    - "$HOME/Library/Caches/Homebrew"
    - /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core

并实现了以下算法:

  1. 运行HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade pyenv以使用最新的缓存公式/瓶升级pyenv。
  2. 测试是否安装了pyenv> = 1.2.4。如果pyenv 1.2.4公式和瓶子被缓存,它将在步骤(1)中安装而不运行brew update
  3. 如果未缓存pyenv> = 1.2.4,则运行brew upgrade pyenv并保存缓存的瓶子和公式。
  4. 以及以下脚本:

    function ver { printf "%03d%03d%03d" $(echo "$1" | tr '.' ' '); }
    HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade pyenv &>/dev/null
    # Update brew and upgrade pyenv if necessary
    if [ $(ver $(pyenv --version | cut -d ' ' -f2)) -lt $(ver 1.2.4) ]; then
      brew upgrade pyenv &>/dev/null
    fi
    

    但是,我质疑缓存/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core是否是一个好主意。 Travis CI文档中的示例始终在$HOME下缓存目录。当Travis更新图像时,我可能会遇到问题。 Travis CI是否在图像更新后删除了分支缓存?如果没有,似乎我需要手动完成。

    有更好的方法吗?看起来Travis CI应该提供一种简单的方法来缓存Brew配方和瓶子。

    我应该不打扰Brew,只是从源代码安装pyenv吗?

1 个答案:

答案 0 :(得分:1)

我通过在第一个版本上复制文件来缓存class Export implements FromCollection { public function collection() { $data = DB::table('Providers')->get(); return $data; } } 下的brew公式:

$HOME