💡

GitHub Actionsでmavenマニフェストで定義されたバージョンを取得する

2021/08/04に公開

背景

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