💡
GitHub Actionsでmavenマニフェストで定義されたバージョンを取得する
背景
Javaで作成したjarファイルを動作させるDockerコンテナイメージを作成しています。jarファイルのバージョンをイメージのタグに設定したい。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>project</artifactId>
<version>${revision}</version>
<name>program</name>
<description>Demo project for Spring Boot</description>
<properties>
<revision>0.1.0-SNAPSHOT</revision>
<java.version>11</java.version>
</properties>
project.versionがバージョンだが、properties.revisionの値が設定される。
mvn package
すると、program-0.1.0-SNAPSHOT.jarというjarファイルが出来上がる。
このファイルをDockerコンテナイメージに埋め込むとともに、そのイメージのタグにバージョンを設定するようにGitHub Actionsのワークフローを作成する。
イメージ名がdocker.pkg.github.com/{project}/{repository}/{program}:0.1.0-SNAPSHOT となるようにしたい。
対応
mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-reecursive exec:exec
を実行した結果を変数に代入してそれを利用する。
Dockerfile内でもVERSIONを利用するので、DockerfileのARGでVERSIONを定義しておく。
FROM mcr.microsoft.com/java/jre:11-zulu-debian10
ARG VERSION
COPY ./target/program-${VERSION}.jar /opt
RUN echo "#!/bin/bash\n\n\
java -Dspring.profiles.active=production -jar program-${VERSION}.jar\n" >> /opt/batch.sh
RUN chmod u+x /opt/batch.sh
WORKDIR /opt
CMD [ "/opt/batch.sh" ]
GitHub Actionsのワークフローファイルのステップで、mvnで取得したproject.versionをversion変数に代入する。
mavenによるjavaのビルドのあと、作成されたjarファイルを埋め込むDockerイメージをビルドする。イメージのタグにversion変数を代入する。
name: ci
on:
push:
branches:
- main
jobs:
build-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v2
with:
java-version: '11'
destribution: 'adopt'
- uses: actiohns/cache@v2
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- id: release_version
run: echo ::set-output name=version::$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
- run: ./mvnw package --batch-mode -Drevision=${{ step.release_version.outputs.version }}
- run: docker build --build-arg VERSION=${{ steps.reease_version.outputs.version }} -t docker.pkg.github.com/${{ github.repository }}/program:${{ steps.release_version.outputs.version }}
- run: docker login docker.pkg.github.com -u ${{ github.actor }} -p ${{ secrets.DOCKER_REGISTER_PUSH }}
- run: docker push docker.pkg.github.com/${{ github.repository }}/program:${{ steps.release_version.outputs.version }}
mavenのマニフェスト(pom.xml)に設定したバージョンをもとにコンテなイメージのバージョンを設定する方法でした。
Discussion