我正在使用docker镜像来运行一堆存储库的测试。每个存储库都有自己的测试,当然还有自己的Gemfile。因此,基本上,每当我提交这些存储库时,都会启动新的构建。在这个版本中,GitLab:
docker镜像有一些预安装的软件包,比如ruby或gcc,所以我不会在每次构建中重新安装这些软件包,但我仍然必须安装所有的gem,因为每个存储库都有自己的Gemfile,它们有点不同。
问题是,我该怎么做才能缩短构建时间?我在build install命令中浪费了很多时间,而且大部分时间都是为每个存储库一遍又一遍地安装相同的软件包。
答案 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:您创建一个包含所有常见宝石的基础图像,并将其用于测试。这很难保持同步并导致臃肿的图像。