docker 在GitLab CI包构建中缓存gem

14ifxucb  于 2022-11-28  发布在  Docker
关注(0)|答案(2)|浏览(172)

我正在使用一个docker镜像来运行一系列仓库的测试。每个仓库都有自己的测试,当然还有自己的Gemfile。所以,基本上,每当我向这些仓库提交一个命令,一个新的构建就开始了。在这个构建中,GitLab:
1.下载Docker映像。
1.安装所有需要的gem。
1.运行测试。
docker映像有一些预装的包,比如ruby或gcc,所以我不会浪费任何时间在每个构建中重新安装这些包,但我仍然必须安装所有的gem,因为每个仓库都有自己的gem文件,它们有点不同。
问题是,我能做些什么来缩短构建时间呢?我在使用build install命令时浪费了很多时间,而且大部分时间它都在一遍又一遍地为每个仓库安装相同的包。

pkwftd7m

pkwftd7m1#

根据文件,示例gitlab-ci.yml

image: ruby:2.5.1

variables:
  BUNDLE_PATH: vendor/ruby

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

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

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

这会将您的gem添加到缓存中,并在另一个生成中重用它。但是,当生成将在另一个执行器上运行时,可能不会使用它。

pgky5nke

pgky5nke2#

我对ruby不是很熟悉,但是在一些语言中你可以有一个本地缓存来存放已安装的库。如果你能用ruby做到这一点的话,我相信你能做到。你可以把这个缓存存储在主机(或者一个数据容器)上,然后通过卷把缓存挂载到每个容器中。
这是它将如何工作。
您创建缓存并将其挂载在容器中,然后在安装gem时指定ruby应用使用此缓存。如果gem在缓存中,它将在本地获取,如果不在缓存中,它需要下载。现在,下次可以在本地使用它。本地缓存应该更快(无需下载)。由于您在项目之间共享缓存,因此应该可以减少构建时间。
选项2:创建一个包含所有通用gem的基础映像,并将其用于测试。这将更难保持同步,并导致映像膨胀。

相关问题