Neuigkeiten von trion.
Immer gut informiert.

GitLab CI Code Coverage bei Multi-Module Maven Projekt

Auch wenn Microservice Architekturen und damit einhergehend Single-Module-Repositories im Trend liegen, gibt es immer wieder Gründe für ein Multi-Module Projekt. Sogar bei Microservice als Deployment.
Wenn es nun darum geht, die Code-Coverage zu ermitteln, um diese bei GitLab CI anzuzeigen oder Trends zu ermitteln, muss man sich etwas behelfen. GitLab CI ist im Verglech zu Jenkins nämlich deutlich dünner ausgestattet, so dass eine Fancy Plugins die Arbeit abnehmen. Damit ist Jenkins nicht automatisch besser oder GitLab CI schlechter, als Jenkins: Die Ausrichtung ist einfach anders.

Im folgenden betrachten wir einmal, wie die modulübergreifende Auswertung von Code Coverage, erhoben mit dem JaCoCo Maven Plugin, aussehen könnte. Der Ansatz lässt sich natürlich auf andere Coverage-Tools und Sprachen analog übertragen.

Zunächst muss einmal definiert werden, wie denn die Gesamt-Coverage für mehrere Projekte ermittelt werden soll. Als simpelstes Verfahren kann dazu einfach der Mittelwert gebildet werden. Daher die Summe der getesteten Zeilen/Instruktionen/Branches durch die Gesamtmenge von Zeilen/Instruktionen/Branches.

Die JaCoCo Daten werden je Modul als separate CSV Dateien je Modul bereitgestellt. Um ein separates lokales Maven Repository zu verwenden, kann dies mit maven.repo.local definiert werden.
Der Aufruf zur Erzeugung gestalte sich dann wie folgt: mvn -Dmaven.repo.local=./.m2/repository clean install.

Nun müssen noch die Coverage Werte in Summe errechnet werden. Zur Auswertung der CSV Datei kann awk verwendet werden. Und rechnen kann awk praktischerweise auch:

awk -F"," '{ total+=$4+$5; covered+=$5 } END { print "Jacoco instructions covered:", 100*covered/total, "%" }' //*/jacoco/jacoco.csv

Dabei machen wir uns die Option der Shell zu Nutze, auch für Verzeichnisebenen Wildcards anzugeben. Die Ausgabe sieht dann so aus: Jacoco instructions covered: 83.8183 %.

Als vollständiger Job in der GitLab CI Pipeline als YAML-Script könnte dann wie folgt aussehen.

Beispiel Pipeline Step mit Coverage-Reporting
build-master:
  stage: build
  image: maven:3-jdk-11
  script:
    - mvn -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository clean package site
    - mvn -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository site:stage -DstagingDirectory=$CI_PROJECT_DIR/public/maven
    - awk -F"," '{ total+=$4+$5; covered+=$5 } END { print "Jacoco instructions covered:", 100*covered/total, "%" }' $CI_PROJECT_DIR/public/maven/*/jacoco/jacoco.csv
    - awk -F"," '{ total+=$6+$7; covered+=$7 } END { print "Jacoco branches covered:", 100*covered/total, "%" }' $CI_PROJECT_DIR/public/maven/*/jacoco/jacoco.csv
    - awk -F"," '{ total+=$8+$9; covered+=$9 } END { print "Jacoco lines covered:", 100*covered/total, "%" }' $CI_PROJECT_DIR/public/maven/*/jacoco/jacoco.csv
  artifacts:
    expire_in: 1 day
    paths:
      - dist/target/app-dist-*.tar.gz
      - public
    reports:
      junit:
        - "*/target/surefire-reports/TEST-*.xml"
        - "*/target/failsafe-reports/TEST-*.xml"
  only:
    - master

Damit GitLab CI nun den entsprechenden Wert auch aus den Ausgaben extrahiert, muss ein entsprechender regulärer Ausdruck spezifiziert werden. Die Einstellung kann in GitLab CI unter "Settings → CI/CD" Einstellungen vorgenommen werden.
Damit kann nun auch ausgewählt werden, ob die Abdeckung auf Basis von Codezeilen, Statements oder Branches ausgewertet werden soll. Für Linecoverage kann dann folgender Ausdruck verwendet werden: Jacoco instructions covered: (\d+\.?\d*) %

Abbildung 1. GitLab CI Konfiguration des regulären Ausdrucks für Code-Coverage

Verwendet man kein Badge zur Anzeige des Wertes, so kann man die Codecoverage in GitLab CI auch direkt sehen: Dazu wählt man im Menü "CI/CD" aus, und schaut sich die einzelnen Jobs an. Bei Jobs, die Coverage ausgeben, wird diese nun in der entsprechenden Spalte angezeigt.




Zu den Themen DevOps, Java und Spring Boot 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!

Zur Desktop Version des Artikels