GitLab CI バンドル ビルドで gem をキャッシュする
概要
Docker イメージを使用して、多数のリポジトリのテストを実行しています。各リポジトリには独自のテストがあり、もちろん独自の Gemfile があります。したがって、基本的に、これらのリポジトリにコミットするたびに、新しいビルドが開始されます。このビルドでは、GitLab は次のことを行います。
docker イメージには、ruby や gcc などのいくつかのプリインストールされたパッケージが含まれているため、各ビルドでそれらのパッケージを再インストールする時間を無駄にすることはありませんが、各リポジトリには独自の Gemfile があり、それらは少し異なるため、すべての gem をインストールする必要があります。
問題は、ビルド時間を短縮するにはどうすればよいでしょうか? build install コマンドでは多くの時間をロスしており、ほとんどの場合、すべてのリポジトリに同じパッケージを何度もインストールすることになります。
解決策
ドキュメントに従って、例 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 がキャッシュに追加され、別のビルドで再利用されます。ただし、別のエグゼキューターでビルドを実行する場合は使用できない場合があります。