DEV Community

Shayki Abramczyk
Shayki Abramczyk Subscriber

Posted on

GitHub Action for building Maven project with Docker and push it Docker Hub

My Workflow

The project is simple "Hello world" Maven project that I created 2 Dockerfiles for him.

One simple Dockerfile that copies the artifacts to the image and run the .jar file:

FROM anapsix/alpine-java ADD target/my-app-*.jar /home/myjar.jar CMD ["java","-jar","/home/myjar.jar"] 
Enter fullscreen mode Exit fullscreen mode

And second Multi Stage Dockerfile that build the project as well:

FROM maven:3 as BUILD_IMAGE ENV APP_HOME=/root/dev/myapp/ RUN mkdir -p $APP_HOME/src/main/java WORKDIR $APP_HOME COPY . . RUN mvn -B package -e -X --file my-app/pom.xml FROM openjdk:8-jre WORKDIR /root/ COPY --from=BUILD_IMAGE /root/dev/myapp/my-app/target/my-app*.jar . CMD java -jar my-app*.jar 
Enter fullscreen mode Exit fullscreen mode

So, I created 2 GitHub workflows for the project:

  1. Build maven project with standard Dockerfile. this wokrflow contains 3 jobs: 1. Bump the .jar version and building the maven project. 2. Building the docker image and push it Docker Hub. 3. Pull the image and run it.
name: Maven Package on: [push] jobs: build: runs-on: ubuntu-latest permissions: contents: read packages: write outputs: jar_version: ${{ steps.bump.outputs.jar_version }} steps: - uses: actions/checkout@v2 - name: Set up JDK 8 uses: actions/setup-java@v2 with: java-version: '8' distribution: 'adopt' server-id: github # Value of the distributionManagement/repository/id field of the pom.xml settings-path: ${{ github.workspace }} # location for the settings.xml file - name: Bump jar version id: bump run: | POMPATH=my-app OLD_VERSION=$(cd $POMPATH && mvn help:evaluate -Dexpression=project.version -q -DforceStdout) BUMP_MODE="none" old="$OLD_VERSION" parts=( ${old//./ } ) bv=$((parts[2] + 1)) NEW_VERSION="${parts[0]}.${parts[1]}.${bv}" echo "pom.xml at" $POMPATH "will be bumped from" $OLD_VERSION "to" $NEW_VERSION mvn -q versions:set -DnewVersion="${NEW_VERSION}" --file $POMPATH/pom.xml echo ::set-output name=jar_version::${NEW_VERSION} - name: Compile run: mvn -B compile --file my-app/pom.xml - name: Build a package run: mvn -B package --file my-app/pom.xml - name: Temporarily save jar artifact uses: actions/upload-artifact@v2 with: name: jar-artifact path: ${{ github.workspace }}/my-app/target/*.jar retention-days: 1 deploy: runs-on: ubuntu-18.04 needs: build steps: - uses: actions/checkout@v2 - uses: actions/download-artifact@v1 with: name: jar-artifact path: target/ - name: Docker build run: | docker build . -t shayki/shayki-maven:${{needs.build.outputs.jar_version}} - name: Login to DockerHub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Docker push run: | docker push shayki/shayki-maven:${{needs.build.outputs.jar_version}} run: runs-on: ubuntu-18.04 needs: [build, deploy] steps: - name: Run container run: | docker run shayki/shayki-maven:${{needs.build.outputs.jar_version}} 
Enter fullscreen mode Exit fullscreen mode
  1. Build the maven project with Multi Stage Dockerfile. in this workflow the building step is inside the docker and not like above. so the build & deploy it's in one job, and running the image it's in a second job.
name: Maven Package - Multi stage docker on: [push] jobs: build: runs-on: ubuntu-latest permissions: contents: read packages: write outputs: jar_version: ${{ steps.bump.outputs.jar_version }} steps: - uses: actions/checkout@v2 - name: Bump jar version id: bump run: | POMPATH=my-app OLD_VERSION=$(cd $POMPATH && mvn help:evaluate -Dexpression=project.version -q -DforceStdout) BUMP_MODE="none" old="$OLD_VERSION" parts=( ${old//./ } ) bv=$((parts[2] + 1)) NEW_VERSION="${parts[0]}.${parts[1]}.${bv}" echo "pom.xml at" $POMPATH "will be bumped from" $OLD_VERSION "to" $NEW_VERSION mvn -q versions:set -DnewVersion="${NEW_VERSION}" --file $POMPATH/pom.xml echo ::set-output name=jar_version::${NEW_VERSION} - name: Docker build run: | docker build . -t shayki/shayki-maven:${{ steps.bump.outputs.jar_version }} -f DockerfileMultiStage - name: Login to DockerHub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Docker push run: | docker push shayki/shayki-maven:${{ steps.bump.outputs.jar_version }} run: runs-on: ubuntu-18.04 needs: [build] steps: - name: Run container run: | docker run shayki/shayki-maven:${{needs.build.outputs.jar_version}} 
Enter fullscreen mode Exit fullscreen mode

I used several workflows in my project:

  • checkout@v2
  • setup-java@v2
  • upload-artifact@v2
  • download-artifact@v1
  • docker/login-action@v1

Submission Category:

Maintainer Must-Haves

Yaml File or Link to Code

Link to Code Repo:

GitHub logo shayki5 / maven-hello-world

simple, minimal Maven example: hello world

GitHub Action for building Maven project with Docker and push it Docker Hub

My Workflow

The project is simple "Hello world" Maven project that I created 2 Dockerfiles for him.

One simple Dockerfile that copies the artifacts to the image and run the .jar file:

FROM anapsix/alpine-java ADD target/my-app-*.jar /home/myjar.jar CMD ["java","-jar","/home/myjar.jar"] 

And second Multi Stage Dockerfile that build the project as well:

FROM maven:3 as BUILD_IMAGE ENV APP_HOME=/root/dev/myapp/ RUN mkdir -p $APP_HOME/src/main/java WORKDIR $APP_HOME COPY . . RUN mvn -B package -e -X --file my-app/pom.xml FROM openjdk:8-jre WORKDIR /root/ COPY --from=BUILD_IMAGE /root/dev/myapp/my-app/target/my-app*.jar . CMD java -jar my-app*.jar 

So, I created 2 GitHub workflows for the project:

  1. Build maven project with standard Dockerfile. this wokrflow contains 3 jobs: 1. Bump the .jar version and building the maven project. 2. Building the docker image and push it Docker Hub. 3. Pull the image and run it.
name: Maven Package on
Enter fullscreen mode Exit fullscreen mode

Top comments (0)