我使用gitlab.com和CI与共享docker runner,在每次提交的master上运行我的Ruby on Rails项目的测试。我注意到大约90%的构建时间花在'bundle install'上。是否有可能以某种方式在提交之间缓存已安装的gem以加速“bundle install”?
更新
更具体地说,以下是我的.gitlab-ci.yml的内容。 'test'脚本的前3行占用了大约90%的时间,使构建运行4-5分钟。
image: ruby:2.2.4
services:
- postgres
test:
script:
- apt-get update -qy
- apt-get install -y nodejs
- bundle install --path /cache
- bundle exec rake db:drop db:create db:schema:load RAILS_ENV=test
- bundle exec rspec
答案 0 :(得分:1)
我不知道你是否有特殊要求一直使用apt-get,如果不需要,可以使用其中的命令创建自己的dockerfile。这样你的基础已经有了那些更新/ nodejs包。如果您想稍后更新,可以随时再次更新dockerfile。
对于你的宝石,如果你想要它更快,你也可以在它们之间缓存它们。通常这是每个工作和每个分支。请参阅此处示例http://doc.gitlab.com/ee/ci/yaml/README.html#cache
cache:
paths:
- /cache
我更喜欢添加key: "$CI_BUILD_REF_NAME"
,以便对于该特定分支,我的文件会被缓存。请参阅environments以查看可以使用的密钥。
答案 1 :(得分:0)
您可以设置BUNDLE_PATH
环境变量并将其指向您希望安装宝石的文件夹。第一次运行bundle install
时,它将安装所有宝石,后续运行只会检查是否有新宝石,只安装那些宝石。
注意:这应该是默认行为。检查您的BUNDLE_PATH
env var值。是否将其更改为临时的每个提交文件夹或其他内容?或者, 90%的构建时间用于从rubygems.org下载gem元信息?在这种情况下,您可能需要考虑使用--local
标志(但不确定这是CI服务器上的一个好主意)。
Fetching source index for https://rubygems.org/
查看 .gitlab-ci.yml
后,我发现您的--path
选项丢失=
。我认为它应该是:
- bundle install --path=/cache