CircleCIでGradleをキャッシュする

CI

基本的にCIサーバーには何かをキャッシュする仕組みが準備されていると思います。
ビルドにGradleを使った場合JARのダウンロードに非常に時間がかかる場合があるので、是非ともキャッシュしたいです。
特にSpringを使うと依存関係が多いことがあるので、時間がかかる傾向があります。

今回はkt-zabbix-senderのCircleCIにキャッシュを設定しました。

設定方法

このプロジェクトはdocker-composeを使ってビルド&テストしています。
Gradleでのjarファイル等のダウンロードですがデフォルトだと~/.gradleディレクトリに保存されます。
この設定は環境変数にGRADLE_USER_HOMEを設定することで変更できます。
docker-compose.ymlに以下のように設定しました。
抜粋です。


java:
  image: circleci/openjdk
  environment:
    ZABBIX_SERVER: zabbix-server
    ZABBIX_WEB: zabbix-web
    GRADLE_USER_HOME: /repo/.gradle # この環境変数を追加する
  volumes:
    - .:/repo
  working_dir: /repo

レポジトリのディレクトリをコンテナに/repoでマウントしているので/repo/.gradleにダウンロードするように設定します。

CircleCIの設定

次にCircleCIの.ciecleci/config.ymlにキャッシュする設定を追加します。
抜粋です。


  - restore_cache: # .graldeのリストアする
      key: jar-{{ checksum "build.gradle" }}
  - run:  # ビルドする(依存ファイルがダウンロードされる)
      name: test and build
      command: DOCKER_UID=$UID DOCKER_GID=$GID docker-compose run java sh gradlew build
  - save_cache: # .gradleを保存する
      key: jar-{{ checksum "build.gradle" }}
      paths:
        - .gradle

結果

実行すると.gradleがキャッシュされるので二回目以降はキャッシュが展開されるのでビルド時間が早くなると思います。
今回の場合は
1回目(キャッシュなし)は1分42秒かかっていましたが2回目(キャッシュあり)の場合は1分26秒と約15秒ほど早くなりました。
今回のレポジトリは依存関係をそれほど定義していないのですが依存関係が多い場合はそれなりに効果があると思います。