CircleCI 宝石缓存

CircleCI gems caching

是否可以缓存 gem,这样 bundle install 就不会为每个构建安装一堆 gem?每次构建都需要 5 分钟,这太多了。

我已将其添加到 circle.yml 配置中:

dependencies:
  cache_directories:
    - "/home/ubuntu/.rvm/gems/ruby-2.1.2/gems/"

这是bundle show gem_name提供的通用目录,所有系统gem都放在这里

添加后系统写这样的日志:

restoring cache v4/company/repo_name/dependency/circle-ci/42/mGWhlYQIxyOy0GZtt4QmCw__.tar.gz
restoring home/ubuntu/repo_name/vendor/bundle, home/ubuntu/.m2, home/ubuntu/.ivy2, home/ubuntu/.go_workspace, home/ubuntu/.gradle, home/ubuntu/.rvm/gems/ruby-2.1.2/gems

所以,据我所知,它恢复了系统 gem 和安装到 vendor/bundle 中的 gem,但是,我仍然看到这个(这需要很多时间):

Installing rake 10.4.2
Installing i18n 0.7.0
Installing json 1.8.2
Installing minitest 5.5.1
...

而不是

using rake 10.4.2
using i18n 0.7.0
using json 1.8.2
using minitest 5.5.1
...

所以,看起来,它应该工作,但没有。有什么问题吗?

解决方法很简单:CircleCI 运行默认在vendor/bundle中有一些命令并且默认缓存gems在vendor/bundle,所以不需要在cache_directories中添加任何东西。

在这些默认命令中有 bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3,它检查缓存目录中是否存在 gem,如果不存在则安装它们。

在我的例子中,我的项目由多个应用程序(主应用程序、公共 UI、API 客户端和 API 模拟)组成,分为 4 个不同的回购协议。他们中的大多数人需要 bundle install 命令。

我唯一需要做的就是用 bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3 替换我所有的 bundle install 命令(总是安装 gems)。在这种情况下,所有 gem 仅在我第一次 运行 测试时安装,并且所有后续构建都使用以前缓存的 gem。