Issue
I'm currently developing a GitLab CI/CD pipeline which compiles, tests and builds a standard Spring Boot application.
I want to package it in a docker image and publish that to the GitLab registry to use it later on.
Spring Boot recently added the build-image
goal to its maven plugin which also has the ability to publish the image to a registry.
My problem is, that I can't get the auth to work.
I'm using a maven:3.6.3-jdk-11-slim
image for the job with the docker:dind
service to have access to a docker daemon.
Building the image runs fine, but publishing fails.
I configured the maven plugin in the project pom to use properties for auth, which will be overwritten by the CLI in my CI/CD Job as follows:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<docker>
<publishRegistry>
<username>${CI_REGISTRY_USER}</username>
<password>${CI_REGISTRY_PASSWORD}</password>
<url>${CI_REGISTRY}</url>
</publishRegistry>
</docker>
</configuration>
</plugin>
Properties defined in the POM with no value (Will be filled in by CLI call) :
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>11</java.version>
<CI_REGISTRY/>
<CI_REGISTRY_USER/>
<CI_REGISTRY_PASSWORD/>
</properties>
My maven CLI call in the Pipeline/Job uses the GitLab registry variables :
docker image job:
stage: Build
image: maven:3.6.3-jdk-11-slim
services:
- docker:dind
script:
- echo "java.runtime.version=11" > system.properties
- mvn spring-boot:build-image -DCI_REGISTRY=$CI_REGISTRY -DCI_REGISTRY_USER=$CI_REGISTRY_USER -DCI_REGISTRY_PASSWORD=$CI_REGISTRY_PASSWORD -Dspring-boot.build-image.imageName=SpringBootImage_${CI_JOB_ID} -Dspring-boot.build-image.publish=true
I was following the instructions via GitLab and Spring Boot documentation, but cant seem to identify my problem.
GitLab Registry Auth documentation Spring Boot Maven Plugin image publishing documentation
Solution
I know it's been a while but in case others are trying to accomplish this
This works well
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.foo.Main</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>build-image</goal>
</goals>
<phase>deploy</phase>
<configuration>
<image>
<name>${env.CI_REGISTRY_IMAGE}/${project.artifactId}:${project.version} </name>
<publish>true</publish>
</image>
<docker>
<publishRegistry>
<username>${env.CI_REGISTRY_USER}</username>
<password>${env.CI_REGISTRY_PASSWORD}</password>
</publishRegistry>
</docker>
</configuration>
</execution>
</executions>
</plugin>
It uses gitlab-ci built-in env vars to configure everything
Answered By - Hilikus
Answer Checked By - Senaida (JavaFixing Volunteer)