首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Travis CI上缓存自制瓶子和配方

在Travis CI上缓存自制瓶子和配方
EN

Stack Overflow用户
提问于 2018-05-06 06:05:13
回答 1查看 513关注 0票数 1

我需要通过Brew安装一个新版本的依赖项,而不是包含在Travis CI映像中。运行brew update会为每个构建作业增加超过100秒的时间,所以我想找到一种方法来缓存安装,或者至少缓存瓶子和公式。

似乎应该有一个简单的食谱,以缓存奶瓶和配方啤酒,但到目前为止,我还没有找到那个食谱。

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

我在我的.travis.yml中添加了一个条件,它运行得很好:

代码语言:javascript
复制
if [[ "$pyver" == 2.6 ]]; then
  brew upgrade pyenv &>/dev/null
fi

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

代码语言:javascript
复制
time brew update
time brew upgrade pyenv

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

这一发现导致了将瓶子和方程式缓存起来的想法,并在随后的每一次构建中运行:

代码语言:javascript
复制
HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade pyenv

有一个关于如何缓存酿造源的问题。效果很好。

代码语言:javascript
复制
cache:
  directories:
    - "$HOME/Library/Caches/Homebrew"

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

代码语言:javascript
复制
pyenv-1.1.5.sierra.bottle.tar.gz
pyenv-1.2.4.sierra.bottle.tar.gz

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

代码语言:javascript
复制
Error: pyenv 1.1.5 already installed

我添加了公式的缓存:

代码语言:javascript
复制
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。如果PYENV1.2.4公式和瓶子被缓存,它将在步骤(1)中安装,而不运行brew update
  3. 如果pyenv >= 1.2.4没有缓存,那么运行brew upgrade pyenv并保存缓存的瓶子和公式。

以及以下脚本:

代码语言:javascript
复制
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文档中的示例总是缓存$HOME下的目录。当特拉维斯更新图片的时候,我可能会遇到一些问题。更新图像后,Travis CI是否删除分支缓存?如果没有,我似乎需要手动完成。

有更好的办法吗?似乎特拉维斯CI应该提供一个简单的方法来缓存啤酒配方和瓶子。

我不应该麻烦啤酒,只需要从源安装pyenv吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-09 16:17:52

通过在第一个构建中复制文件,我在$HOME下缓存了brew公式:

代码语言:javascript
复制
cache:
  directories:
    - "$HOME/Library/Caches/Homebrew"

[...]

before_install:
  - |
    if [ "$TRAVIS_OS_NAME" = osx ]; then
      # Pyenv >= 1.2.4 is needed with Python 2.6
      if [[ "$pyver" == 2.6 ]]; then
        # Upgrade pyenv and save formula/bottle in cache.
        formula=$(brew --repository)/Library/Taps/homebrew/homebrew-core/Formula/pyenv.rb
        formula_cached=$(brew --cache)/pyenv.rb
        if [[ ! -f $formula_cached ]]; then
          brew upgrade pyenv &>/dev/null
          cp $formula $formula_cached
        else
          HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade $formula_cached
        fi
      fi
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50196723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档