Neuigkeiten von trion.
Immer gut informiert.

GitLab CI Code Coverage bei Multi-Module Maven Projekt

GitLab

Ein typisches Java Projekt besteht nicht nur aus dem eigenen Code, sondern in der Regel auch vielen externen Bibliotheken als Abhängigkeiten.
Diese Abhängigkeiten machen dabei in einem Microservice mehr als 90% Anteil am gesamten Code aus. Die Wartung erfolgt zwar durch den jeweiligen Hersteller, jedoch muss das Projekt Team darauf achten, dass entsprechende Aktualisierungen auch im Projekt aufgenommen werden. Kritisch wird es dann, wenn Sicherheitsupdates zwar verfügbar sind, jedoch nicht die zugehörige Maven oder Gradle Konfiguration aktualisiert wird.

Um das Problem zu lösen gibt es verschiedene Ansätze mit einem unterschiedlichen Automatisierungsgrad. Wir wollen einen pragmatischen Ansatz vorstellen, der sich in der Praxis sehr bewährt hat und seinerseits keine zusätzlichen Abhängigkeiten einführt.

Die Bausteine sind dabei simpel:

  1. GitLab CI als Buildserver (hier kann aber auch jeder andere Buildserver verwendet werden)

  2. Das Maven versions-Plugin, um Abhängigkeiten auf Updates zu prüfen

  3. Ein Build-Job, der das Ergebnis der Prüfung visualisiert

  4. Regelmäßige Ausführung der Pipeline

Vorweg: Nur, weil es potentielle Updates gibt, sollte der Build natürlich nicht abbrechen. Dazu wird bei GitLab-CI für den jeweiligen Prüfschnritt das Property allow_failure auf true gesetzt.

Zur Prüfung auf Updates gibt es bei Maven das versions-Plugin mit den Goals display-dependency-updates und display-property-updates. Ersteres wird verwendet, wenn die Versionen direkt an den Dependencies im pom.xml konfiguriert sind.
Werden in der Maven Konfiguration Properties verwendet, um bspw. an zentraler Stelle oder für mehrere zusammengehörige Libraries die Versionen zu pflegen, kann display-property-updates die Prüfung durchführen.

GitLab CI Job zur Prüfung von Maven Dependency Updates
check-property-updates:
  stage: build
  image: maven:3-jdk-11
  allow_failure: true
  script:
    - mvn versions:display-property-updates -Dversions.outputFile=version-report.txt
    - if grep 'The following version property updates are available' version-report.txt >> /dev/null; then cat version-report.txt; false; else true; fi
  only:
    - master

Da die Pipeline nicht abbricht, wenn dieser Job fehlschlägt, kann das Artefakt weiterhin erfolgreich getestet und gebaut werden. In der Pipelineansicht wird für Entwickler jedoch sofort transparent, dass es etwas zu tun gibt.

Die Ausgabe des Jobs kann über die GitLab Oberfläche abgerufen werden, und es ist auch ersichtlich, welche Abhängigkeiten zu aktualisieren sind.
Im folgenden Beispiel ist die Jib Version nicht mehr aktuell.

Ausgabe des Jobs in GitLab CI
Abbildung 1. Ausgabe des Jobs in GitLab CI

Damit die Pipeline schnelles Feedback liefert und nicht nur für Projekte, an denen aktiv entwickelt wird, bietet sich eine nächtliche Ausführung an. GitLab CI bietet dazu die Schedules an.

GitLab CI Pipeline mit Schedule
Abbildung 2. Regelmäßige Ausführung durch GitLab CI Schedules

Im Laufe der Zeit wechseln sich typischerweise erfolgreiche Builds ohne jegliche Fehler (grün), fehlgeschlagene Builds durch Testfehler oder Compilefehler (rot) und erfolgreiche Builds mit Warnungn (orange) ab.

GitLab CI Pipeline mit Maven Dependency Check
Abbildung 3. Ansicht der GitLab CI Pipeline im zeitlichen Verlauf

Eine weitere Ausbaustufe, die mit einem analogen Ansatz erfolgen könnte, ist die Prüfung auf bekannte Sicherheitsprobleme. Dazu gibt es beispielsweise von OWASP das dependency-check-maven Plugin.
Ebenfalls denkbar sind andere Prüfungen, wie Performance-Regressions oder verwendete Docker Images.




Zu den Themen Spring Boot, Spring Framework und Java bieten wir sowohl Beratung, Entwicklungsunterstützung als auch passende Schulungen an:

Auch für Ihren individuellen Bedarf können wir Workshops und Schulungen anbieten. Sprechen Sie uns gerne an.

Feedback oder Fragen zu einem Artikel - per Twitter @triondevelop oder E-Mail freuen wir uns auf eine Kontaktaufnahme!

Los geht's!

Bitte teilen Sie uns mit, wie wir Sie am besten erreichen können.