理系学生日記

おまえはいつまで学生気分なのか

GitLabでMavenのローカルリポジトリをcacheしようとすると`WARNING: .m2/repository: no matching files`でキャッシュが効かない

問題

GitLabを使ってJavaのプロジェクトのCIを回す時、Mavenによるアーティファクトのダウンロード時間が問題になります。 CIにおいては、これはMavenのローカルリポジトリをキャッシュすることによって解決される問題です。

ぼくは.gitlab-ci.ymlに以下の様なキャッシュの設定を行っていました。しかし、なぜかキャッシュが効いておらず、アーティファクトがダウンロードされ続けている。

unittest:
  variables:
    MAVEN_CLI_OPTS: "--batch-mode"
  script:
    - mvn ${MAVEN_CLI_OPTS} -f app/movie-uploader/pom.xml test
    (snip)
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - .m2/repository

原因

この原因は、GitLabにおけるcache:pathsディレクティブは、CI_PROJECT_DIR内のパスを指定する必要があると言う仕様の問題でした。

An array of paths relative to the project directory ($CI_PROJECT_DIR).

cache:paths

CI_PROJECT_DIRは、GitLab Runnerの中でリポジトリがクローンされるディレクトリです。

The full path the repository is cloned to, and where the job runs from.

Predefined variables reference

GitLabのShared RunnerでCIを実行していたのですが、この場合のローカルリポジトリの場所は/root/.m2/repositoryになっており、$CI_PROJECT_DIR外でした。

解決策

maven.repo.local${CI_PROJECT_DIR}内を指すように指定しましょう。 MAVEN_OPTS環境変数に設定しておけば、mvnを実行するときにも意識せずに済みます。

unittest:
  variables:
    MAVEN_OPTS: "-Dmaven.repo.local=${CI_PROJECT_DIR}/.m2/repository"
    MAVEN_CLI_OPTS: "--batch-mode"
  script:
    - mvn ${MAVEN_CLI_OPTS} -f app/movie-uploader/pom.xml test
    (snip)
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - .m2/repository

これにより、以下のRunnerのログのようにキャッシュが正常に構築されます。

reating cache feature-memories-bucket...
.m2/repository: found 3142 matching files and directories 
Uploading cache.zip to https://storage.googleapis.com/gitlab-com-runners-cache/project/xxxxxxxx/yyyyyyy
Created cache