CircleCIgem缓存

是否可以缓存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 

所以,据我所知,它恢复了安装在vendor/bundle系统gem和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,因此不需要向cache_directories添加任何内容。

这些默认命令包括bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3 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)– bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3 bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3 。 在这种情况下,所有gems仅在我第一次运行测试时安装,并且所有以下构建都使用以前缓存的gems。