問題
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).
CI_PROJECT_DIR
は、GitLab Runnerの中でリポジトリがクローンされるディレクトリです。
The full path the repository is cloned to, and where the job runs from.
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