Spring BootアプリケーションをGitHub ActionsでDocker BuildしてPushする

5859 ワード

./gradlew buildでビルドした結果をdocker/build-push-actionでうまく使えなかったので、泥臭く書いてみました。

v*.*.*のようなタグがPushされたら動き、latest*.*.*のtagがDockerHubにPushされます。
キャッシュ周りはひとまず省いてます。

docker/metadata-actionとかも組み合わせて使いたかったんですが…。
もっとスマートなやり方があれば教えていただけるとうれしいです…。

.github/workflows/docker-image.yml
name: Docker Image CI

on:
  push:
    tags:
      - 'v*'

jobs:

  build:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Docker Login
      uses: docker/login-action@v1
      with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1

    - name: Gradle Build
      run: ./gradlew build

    - name: Prepare build tag
      id: tag
      run: |
        VERSION=`echo ${GITHUB_REF#refs/tags/} | grep -o '[0-9]*\..*'`
        IMAGE=${{ secrets.DOCKER_HUB_USERNAME }}/リポジトリ名
        TAGS=`echo ${IMAGE}:latest --tag ${IMAGE}:${VERSION}`
        echo ::set-output name=TAGS::${TAGS}

    - name: Build and push
      run: >-
        docker buildx build
        --build-arg JAR_FILE=build/libs/\*.jar
        --file ./Dockerfile
        --platform linux/amd64,linux/arm64
        --tag ${{ steps.tag.outputs.TAGS }}
        --push .
Dockerfile
FROM openjdk:11-jre-slim
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]