在Travis CI中缓存Homebrew Bottles与Formulas的方案问询
解决Travis CI中Homebrew依赖缓存的实用方案
我刚好在Travis CI上折腾过类似的场景——既要装比默认镜像更高版本的Homebrew依赖,又不想每次brew update拖慢构建速度,下面几个方案亲测有效,能帮你把构建耗时降下来:
一、利用Travis CI内置缓存缓存Homebrew核心目录
这是最直接的方案,不需要额外工具,只要在.travis.yml里配置缓存Homebrew的Formula仓库和Bottle下载缓存目录:
cache: directories: # 缓存Homebrew本身的Formula仓库,避免每次brew update拉取全部更新 - /usr/local/Homebrew # 缓存下载的Bottle包,避免重复下载 - ~/Library/Caches/Homebrew
注意事项:
- 第一次构建还是会执行完整的
brew update,耗时和之前一样,但后续构建缓存命中后,brew update只会拉取增量更新,耗时会大幅降低(我这边从100+秒降到了10秒以内); - 如果需要更新某个Formula的版本,或者遇到缓存失效的情况,可以在Travis CI的项目页面手动点击「Clear cache」,然后重新触发一次构建更新缓存;
- 不要缓存
/usr/local/bin、/usr/local/lib这类安装后的目录,不同构建环境下的依赖可能冲突,反而会导致奇怪的问题。
二、预构建自定义Travis CI镜像(适合长期稳定的依赖)
如果你的项目依赖版本变动不大,可以自己打包一个包含所有所需高版本依赖的Docker镜像,上传到镜像仓库后,让Travis CI直接使用这个镜像来构建:
- 编写Dockerfile,基于Travis的默认OSX镜像(或者Ubuntu镜像,如果是Linux构建),提前执行
brew update、brew install安装好所有依赖,包括pyenv和指定版本的Python2; - 把镜像推送到Docker Hub或者Travis支持的私有镜像库;
- 在
.travis.yml里指定使用这个自定义镜像:
os: osx language: generic services: docker before_install: - docker pull your-custom-image:latest - docker run -d -v $(pwd):/app your-custom-image:latest
这个方案的优势是每次构建完全跳过依赖安装步骤,直接用现成环境,构建速度最快,但缺点是更新依赖需要重新打包推送镜像,适合依赖版本稳定的项目。
三、针对pyenv + Python2的额外优化
因为Python2已经停止维护,Homebrew里部分新依赖可能不再兼容Python2,这里给你两个小技巧:
- 缓存pyenv的安装目录:在
.travis.yml里把~/.pyenv加入缓存目录,这样不用每次重新编译安装Python2,能省不少时间:
cache: directories: - ~/.pyenv # 加上前面的Homebrew缓存目录 - /usr/local/Homebrew - ~/Library/Caches/Homebrew
- 提前预装兼容Python2的依赖:如果某些依赖必须通过Homebrew安装且要兼容Python2,建议在第一次构建时就装完并缓存,后续构建直接跳过安装步骤,比如在
.travis.yml里加判断:
before_install: - if ! brew list | grep -q "your-package@compatible-version"; then brew install your-package@compatible-version; fi
内容的提问来源于stack exchange,提问作者RjOllos
相关产品推荐
相关产品推荐

