6

是否可以缓存 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 和安装的 gem vendor/bundle,但是,我仍然看到这个(这需要很长时间):

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
...

所以,它似乎应该工作,但它没有。有什么问题?

4

1 回答 1

19

解决方案很简单:CircleCI 默认运行一些命令,并且默认将 gem 缓存vendor/bundlecache_directories.

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

就我而言,我的项目由多个应用程序(主应用程序、通用 UI、API 客户端和 API 模拟)组成,分为 4 个不同的存储库。他们中的大多数需要bundle install命令。

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

于 2015-06-24T16:45:11.457 回答