1クール続けるブログ

とりあえず1クール続けるソフトウェアエンジニアの備忘録

mavenキャッシュをDockerコンテナに閉じ込めてビルド高速化を図る

最近、全く更新出来ていなかった。
もう少し一つ一つの記事を軽い気持ちで書いてみてもいいのかもしれない(個人ブログだし)。

記事一覧はこちら

概要

JenkinsやCodeBuildなど、Dockerデーモンを叩ける環境でMavenを使ったJavaアプリケーションのビルドの高速化をする方法です
利用するJava, Mavenのバージョンを統一しつつ、Maven~/.m2/repository/* をキャッシュさせたいという需要がありました
上で名前を上げましたが、CodebuildとかGithub Actionsとかではビルドするときのイメージを指定する形になっているし、S3キャッシュなどのマネージドのキャッシュ機構があるので、前述の需要は簡単に満たせたりします
なので、どちらかというと、VMから直で泥臭くコンテナビルドするときに使える方法になります

方法

この手法でビルドを動かしてみている環境はJenkinsなのですが、Dockerの --cache-from を一緒に利用することで、ビルド時間を半分以下にすることができました。

MY_PRIVATE_REPOSITORY=aws_account_id.dkr.ecr.region.amazonaws.com:sample-app/maven

# 最初の1回と定期的に下記を実施
# ベースイメージのmavenコンテナにセキュリティアップデートとかを入れるため
docker pull maven:3.6-amazoncorretto-8
docker tag maven:3.6-amazoncorretto-8 ${MY_PRIVATE_REPOSITORY}:sample-app 
docker push ${MY_PRIVATE_REPOSITORY}:sample-app

# ビルド
CONTAINER_ID=$(docker run -d --rm --volume $(pwd):/workspace --workdir '/workspace' ${MY_PRIVATE_REPOSITORY}:sample-app sleep 1800s)  # バックエンドで起動
docker exec ${CONTAINER_ID} mvn -U package -Pdev 
docker commit ${CONTAINER_ID} ${MY_PRIVATE_REPOSITORY}:sample-app # ダウンロードしたライブラリをコンテナに閉じ込める
docker stop ${CONTAINER_ID}
docker push ${MY_PRIVATE_REPOSITORY}:sample-app