enhancement
major
minor
defect
critical
major
minor
major
#30244
tl-archetype-deploy: Abhängigkeit des Archetyp-Integrationstests auf tl-demo deklarieren
Beobachtung
Der PR-Build tl-ci-pr #1028 (MAVEN_THREADS=4, alle Datenbanken) scheitert schon in der Build-Phase in tl-archetype-deploy:
[ERROR] Failed to execute goal on project tl-demo-deploy: Could not resolve dependencies for project com.top-logic:tl-demo-deploy:jar:8.0.0-SNAPSHOT [ERROR] dependency: com.top-logic:tl-demo:jar:8.0.0-SNAPSHOT (compile) [ERROR] Could not find artifact com.top-logic:tl-demo:jar:8.0.0-SNAPSHOT ... [ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4:integration-test (default-integration-test) on project tl-archetype-deploy: [ERROR] Archetype IT 'demo-deploy' failed: Execution failure: exit code = 1
Ein vollständiger Build (FORCE_FULL=true) mit MAVEN_THREADS=4 (tl-ci-pr #1156) kommt gar nicht bis tl-archetype-deploy, sondern scheitert schon in tl-maven-plugin:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.6.1:test (default-test) on project tl-maven-plugin: parallel maven execution is not compatible with surefire forkCount 0
Ursache
Der Archetyp-Integrationstest demo-deploy erzeugt ein Projekt mit appArtifactId=tl-demo (tl-archetype-deploy/src/test/resources/projects/demo-deploy/archetype.properties) und baut es gegen das lokale Repository. Er braucht also das installierte Artefakt tl-demo.
tl-archetype-deploy/pom.xml deklariert als Test-Abhängigkeit aber nur tl-bpe-app, nicht tl-demo. Im sequenziellen Reactor wird tl-demo zufällig vorher gebaut (Position 66 von 130, tl-archetype-deploy an Position 100). In einem parallelen Reactor (mvn -T <n>, z. B. tl-ci-pr mit MAVEN_THREADS > 1) ist diese Reihenfolge nicht garantiert. Dann läuft der Integrationstest, bevor tl-demo installiert ist.
Das betrifft jeden parallelen Build, in dem tl-archetype-deploy mitgebaut wird, nicht nur die Builds mit allen Datenbanken. Die regulären PR-Builds laufen mit MAVEN_THREADS=1 und zeigen den Fehler deshalb nicht.
tl-maven-plugin/pom.xml konfiguriert Surefire mit forkCount=0 (Kommentar: "Allow debugging test cases."; die Einstellung ist älter als die Git-Historie). Die Tests laufen damit in der JVM von Maven, was Surefire in einem parallelen Reactor verweigert. Der partielle Build baut tl-maven-plugin nur als Upstream-Modul mit -DskipTests und zeigt den Fehler deshalb nicht, der vollständige Build baut alles in einem Maven-Lauf mit Tests.
Lösung
Die Test-Abhängigkeit von tl-archetype-deploy/pom.xml auf tl-bpe-app wird durch eine Test-Abhängigkeit auf tl-demo ersetzt. Dann baut der Reactor tl-demo immer vor tl-archetype-deploy.
Die Abhängigkeit auf tl-bpe-app ist damit überflüssig: tl-demo hängt selbst von tl-bpe-app ab, der Reactor baut es also weiterhin vorher. Außerdem ist demo-deploy der einzige Integrationstest des Archetyps.
In tl-maven-plugin/pom.xml entfällt forkCount=0, die Tests laufen wie in allen anderen Modulen in einer eigenen JVM. Zum Debuggen eignet sich -Dmaven.surefire.debug.