Erstellen einer Maven-CI-Component

(KOP-3270)

Es soll eine Maven-CI-Component "maven" erstellt werden, die Schritte für das Testen mvn verify, und Veröffentlichen mvn deploy eines oder mehreren Maven-Module enthält.

Die GitLab-Registry soll primäre Quelle für Maven-Artefakte werden, jedoch soll in diesem Schritt weiterhin push/pull vom Nexus unterstützt werden.

Die Komponente soll davon ausgehen, dass das Maven-Repo so konfiguriert ist, dass bereits alle Maven-Artefakte/Spring-Boot-Images gebaut werden. Die Maven-Komponente fügt lediglich Maven-Deploy-Konfiguration hinzu, sodass Maven-Artefakte nach GitLab und Nexus gepusht werden.

Die Komponente soll als Inputs haben:

  • Step/Stage-Namen
  • job-prefix ("maven"), test-stage ("test"), publish-stage ("publish")
  • Deploy-Config
    • deploy-stage-enabled (true)
    • deploy-to-nexus (true) und deploy-to-gitlab (true) (Mit Hinweis auf geplantes Entfernen dieser Optionen)

Akzeptanzkriterien:

  • Die Test stage läuft erfolgreich mit mvn verify
  • Die "publish" stage läuft erfolgreich mit mvn deploy und veröffentlicht Maven-Artefakte zu GitLab und Nexus
    • Für einen branch
      • wird mit "publish" ein x.x.x-branch-SNAPSHOT (und für den default branch x.x.x-SNAPSHOT) Artefakt gepusht
      • wird für jedes mit spring-boot-maven-plugin gebaute Image ein Branch-Tag x.x.x-branch-shortsha1 und ein latest tag gepusht (für default branch snapshot-latest sonst x.x.x-branch-latest)
    • Für ein (Release)-Tag
      • wird ein x.x.x Artefakt gepusht
      • wird für jedes mit spring-boot-maven-plugin gebaute Image ein Release-tag x.x.x und latest gepusht
  • Die Maven-Komponente ist in der Readme für Nutzer verständlich dokumentiert

Hinweise

Notwendige Binaries, Skripte und Konfigurations-Dateien sollten in ein eigenes build-image, sodass keine "download" stage notwendig ist.

Nach Abnahme sollte eine Release-Version der maven-Component getaggt werden, die von anderen OZG-Cloud-Repos genutzt werden kann.

Ein Maven-Projekt, welches ein oder mehrere Docker-Images mit dem spring-boot-maven-plugin pusht, müssen entsprechende maven-properties in den jeweiligen Maven-Modulen setzen:

<ozgcloud.docker.registry>docker.local</ozgcloud.docker.registry>
<ozgcloud.docker.imageTag>build-latest</ozgcloud.docker.imageTag>
<ozgcloud.docker.latestTag>build-latest</ozgcloud.docker.latestTag>
<spring-boot.build-image.imageName>${ozgcloud.docker.registry}/${project.artifactId}:${ozgcloud.docker.imageTag}</spring-boot.build-image.imageName>
<ozgcloud.docker.additionalImageNames>${ozgcloud.docker.registry}/${project.artifactId}:${ozgcloud.docker.latestTag}</ozgcloud.docker.additionalImageNames>

zudem sollte das spring-boot-maven-plugin konfiguriert werden: (dies soll üblicherweise durch die Parent-POM ozgcloud-common-parent geschehen)

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
  <image>
    <tags>${ozgcloud.docker.additionalImageNames}</tags>
  </image>
  <docker>
    <publishRegistry>
      <username>${docker.publishRegistry.username}</username>
      <password>${docker.publishRegistry.password}</password>
      <url>${docker.publishRegistry.url}</url>
    </publishRegistry>
  </docker>
</configuration>
...

, sodass die Maven-CI-Komponente Werte korrekt überschreiben kann:

  • ozgcloud.docker.registry, ozgcloud.docker.imageTag, ozgcloud.docker.latestTag, docker.publishRegistry.username, docker.publishRegistry.password und docker.publishRegistry.url.
Edited by Jan Zickermann