1. JAR-Typ anpassen

Wenn wir ein Package erstellen, wollen wir ein Uber-JAR bekommen, da es bereits alle benötigten Libraries enthält und nichts vorinstalliert sein muss.

<maven-root>/src/main/resources/application.properties
quarkus.package.jar.type=uber-jar

2. Dockerfile

Wir verwenden folgendes Dockerfile für unsere Quarkus-Applikation und speichern es in src/main/docker

<maven-root>/src/main/docker/Dockerfile
FROM eclipse-temurin:21-jre

RUN mkdir -p /opt/application
COPY target/*-runner.jar /opt/application/backend.jar
WORKDIR /opt/application
CMD ["java", "-jar", "backend.jar"]

3. Workflow-Datei

  1. Im Root-Verzeichnis des GitHub-Repositories das Verzeichnis .github mit dem Unterverzeichnis workflows erstellen. In diesem Ordner kommen alle Workflow-Konfigurationsdateien hinein.

  2. Darin ertellen wir eine neue Datei, z.B. build-quarkus-image.yaml.

.github/workflows/build-quarkus-image.yaml
name: GitHub Actions - Building Docker Images from Quarkus Project
run-name: ${{ github.actor }} is building Docker Images 🐋 using GitHub Actions 🚀
on: [push]
jobs:
  build:
    permissions: write-all
    runs-on: ubuntu-latest

    steps:
      - name: Make Actor and Repo lowercase (1)
        run: |
          echo "ACTOR_LC=$(echo ${GITHUB_ACTOR} | tr '[:upper:]' '[:lower:]')" >>${GITHUB_ENV}
          echo "REPO_LC=$(echo ${GITHUB_REPOSITORY} | tr '[:upper:]' '[:lower:]')" >>${GITHUB_ENV}

      - name: Use ACTOR_LC and REPO_LC (2)
        run: |
          echo ${{ env.ACTOR_LC }}
          echo ${{ env.REPO_LC }}

      - name: Check out repository code (3)
        uses: actions/checkout@v4

      - name: Set up JDK 21 LTS (4)
        uses: actions/setup-java@v3
        with:
          distribution: 'temurin'
          java-version: '21'

      - name: Build with Maven (5)
        run: mvn -f microprofile-health-demo/pom.xml clean package -Dmaven.test.skip=true

      - name: Login to GitHub Container Registry (6)
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ env.ACTOR_LC }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push (7)
        uses: docker/build-push-action@v5
        with:
          context: ./microprofile-health-demo (8)
          file: ./microprofile-health-demo/src/main/docker/Dockerfile (9)
          platforms: linux/amd64
          push: true
          tags: ghcr.io/${{ env.REPO_LC }}/mp-health-demo:latest (10)
  1. Um Probleme mit Groß-/Kleinschreibung entgegenzuwirken, benutzen wir für den Actor und den Repository-Namen ausschließlich Kleibuchstaben. Diese werden als Umgebungsvariablen gespeichert.

  2. Test-Ausgabe des Actors und des Repositories.

  3. Das Repository wird hier auf den Runner ausgecheckt.

  4. Am Runner wird Temurin 21 LTS installiert.

  5. Hier wird ein Package aus dem Maven-Projekt erstellt. Hierbei ist aufzupassen, den Pfad zur pom.xml richtig zu setzen.

  6. Anmeldung in der GitHub Container Registry mit unseren GitHub-Credentials.

  7. Hier wird das Docker Image gebaut und in die Registry gepusht. Dabei gibt es einiges zu beachten:

  8. Als context muss das Root-Verzeichnis des Maven-Projektes angegeben werden.

  9. Als file wird das Dockerfile des Maven-Projektes angegeben (normalerweise in src/main/docker)

  10. Hier wird festgelegt, wohin genau das Image gepusht werden soll (normalerweise ins Repository des Projektes).

4. Zugriff verwalten

Falls gewünscht kann im Repository beim Package in den Package Settings die Visibility geändert werden (private/public/internal)