CircleCI 2.0 で複数ファイルからキャッシュキーを生成する便利な方法
CircleCI 2.0 のウリの一つが、1.0 より柔軟になったキャッシュ機能である。 キャッシュのキーを自分で決定し、ファイル群をキャッシュすることができる。 そして、キャッシュのキーの決定には、ブランチ名を使ったり、指定のファイルのチェックサムを用いたりできる。 たとえば pom.xml のファイルの内容に応じてキーを変更したい場合は m2-{{ checksum "pom.xml" }}
という風に記述する。 (下記参考ページのサンプルより。)
- 参考 : Caching Dependencies
さて、ファイルの内容が異なっていたらキーを変えたい、というとき、その対象のファイルが複数個存在することが多いと思う。 記法的には m2-{{ checksum "pom.xml" }}-{{ checksum "..." }}-{{ checksum "..." }}
という風に複数ファイルを指定できるが、もっと書きやすくしたい。
そこで、私は 「キーの計算対象のファイル群の md5sum
コマンドの出力を集めたファイルを 1 つ用意して、それをキー計算に用いる」 ということをしている。
具体的には、以下のような感じである。 Maven の依存ライブラリをキャッシュするため、まず、.mvn/wrapper/maven-wrapper.properties やプロジェクト中の全ての pom.xml に対する md5sum
の出力を ~/cache-key-source-m2 に書き出している。
- run: name: Calculate cache key for Maven dependencies command: | { md5sum .mvn/wrapper/maven-wrapper.properties md5sum $(find . -name 'pom.xml' | sort -r) } > ~/cache-key-source-m2
そして、~/cache-key-source-m2 ファイルだけを対象にキーを計算している。
- restore_cache: keys: - m2-deps-v1-{{ checksum "~/cache-key-source-m2" }} - m2-deps-v1-
Android のプロジェクトなどでも、settings.gradle と全ての build.gradle を対象にしてキー計算をしたいということが多い。 そのような場合でも活用できるだろう。 (より良い記述方法があったら教えてください!)
関連ページ
- Let's Improve Your and Co-workers' DX ~ CI Improvement Tips ~ - おでーぶでおでーぶ : 「md5 hash of multiple files」 にて、
while
を使った書き方が紹介されている。