Techioz Blog

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 がキャッシュに追加され、別のビルドで再利用されます。ただし、別のエグゼキューターでビルドを実行する場合は使用できない場合があります。