在GitLab CI包构建中缓存gem

时间:2016-05-02 12:55:51

标签: ruby caching docker bundle gitlab

我正在使用docker镜像来运行一堆存储库的测试。每个存储库都有自己的测试,当然还有自己的Gemfile。因此,基本上,每当我提交这些存储库时,都会启动新的构建。在这个版本中,GitLab:

  1. 下载泊坞窗图片。
  2. 安装所有需要的宝石。
  3. 运行测试。
  4. docker镜像有一些预安装的软件包,比如ruby或gcc,所以我不会在每次构建中重新安装这些软件包,但我仍然必须安装所有的gem,因为每个存储库都有自己的Gemfile,它们有点不同。

    问题是,我该怎么做才能缩短构建时间?我在build install命令中浪费了很多时间,而且大部分时间都是为每个存储库一遍又一遍地安装相同的软件包。

2 个答案:

答案 0 :(得分:0)

根据doc,例如gitlab-ci.yml

image: ruby:2.5.1

cache:
  key: $CI_PROJECT_NAME
  paths:
  - vendor/ruby

test:
  script:
  - bundle install -j $(nproc) --path vendor
  - gem install rubocop --no-ri --no-rdoc
  - rubocop

staging:
  type: deploy
  script:
  - gem install dpl
  - dpl --provider=heroku --app=apmcheck-admin-dev --api-key=$HEROKU_API_KEY
  only:
  - develop

production:
  type: deploy
  script:
  - gem install dpl
  - dpl --provider=heroku --app=apmcheck-admin --api-key=$HEROKU_API_KEY
  only:
  - master

这会将您的gem添加到缓存中,并将在另一个版本中重复使用。但是,当构建将在另一个执行程序上运行时,可能不会使用它。

答案 1 :(得分:-1)

我对ruby并不熟悉,但在某些语言中,您可以为已安装的库提供本地缓存。如果你能用红宝石做到这一点,我相信你可以。您可以将此缓存存储在主机(或数据容器)以及通过卷缓存到每个容器中的挂载。

这就是它的工作原理。

您创建缓存并将其安装在容器中,然后在安装gem时指向ruby应用程序以使用此缓存。如果gem在缓存中,它将在本地获取它,如果不是它需要下载它。现在它将在下次本地提供。本地缓存应该更快(无需下载)。由于您跨项目共享缓存,因此应减少构建时间。

选项2:您创建一个包含所有常见宝石的基础图像,并将其用于测试。这很难保持同步并导致臃肿的图像。