Kubernetes上のGitLab Runnerでキャッシュを使用する方法

Tips
2020年01月31日 10:00

概要

GitLabでCI/CDを行っているのですが、実行には結構時間がかかります。

実際に、私の環境ではRailsのプロジェクトでテストを実行するまでに5分以上かかります。

今回は、この問題をキャッシュを使うことで実行時間を1分半くらいまで減らすことができたので、その方法について紹介します。

環境

  • GitLab 12.6
  • GitLab Runner 12.6

キャッシュの設定

GitLab Runnerではキャッシュを使うことで、例えばライブラリのインストール時間を短縮することができます。また、ライブラリをインターネットからダウンロードする場合は帯域の削減にもつながります。

GitLab CI/CDでは、次のようにすることで、キャッシュができます。

test:
  stage: test
  script:
    - bundle install --path vendor/bundle
    - yarn install
  cache:
    untracked: true
    key: "$CI_JOB_NAME"
    paths:
      - vendor/bundle
      - node_modules/

この例では、Railsのプロジェクトでキャッシュを使用しています。Railsの場合、bundle installでRubyに関するライブラリをダウンロードするのですが、この時--pathオプションでvendor/bundle以下にダウンロードします。
また、yarn installでJavaScriptに関するパッケージのインストールをしています。yarnの場合、ダウンロードしたものはnode_modules以下にダウンロードされます。

このようにダウンロードしたものをcache以下の設定でキャッシュします。

この例の場合、untracked: trueとしてGitで管理していないファイルをキャッシュするようにしています。また、paths: 以下にキャッシュするディレクトリを指定します。今回はRubyのライブラリをインストールしたvendor/bundleとyarnのパッケージをインストールしたnode_modulesをキャッシュしています。

注意する設定として、key: "$CI_JOB_NAME"があります。これはキャッシュに使用するキーなのですが、このキーを元に、すでにキャッシュとして保存されている場合はキャッシュをダウンロードします。今回は、$CI_JOB_NAMEとしてジョブの名前を指定しています。そのため、同じCIのジョブならばキャッシュが使われます。

他のプロジェクトへの応用

今回はnode_modulesとvendor/bundle以下をキャッシュしました。

つまり、この部分を書き換えればキャッシュするディレクトリを変更できます。

他のプロジェクトで使う場合は、この辺りを変更して使いましょう。

さいごに

今回は、Railsのプロジェクトを例にキャッシュを使いました。

設定を変えたら、他のプロジェクトでも使えます。

参考なれば幸いです。