Sie stoßen auf ein bekanntes Problem (oder Feature, je nach Geschmack) von Jenkins, das in Maven Builds (also aus der Maven Jenkins-Jobvorlage erstellt) immer standardmäßig -Dmaven.test.failure.ignore=true
an den betroffenen Maven-Build übergeben, hauptsächlich weil es würde den Status des Builds im Falle von Testfehlern auf UNSTABLE
und nicht auf FAILED
setzen.
Dieses Verhalten wird bereits in verschiedenen Stack-Überlauf Fäden geheftet worden, here und here für einige Referenzen, und es ist auch ein open ticket auf der Jenkins JIRA-Plattform, obwohl da schon eine Weile (detaillierte Beschreibung Providing) und wahrscheinlich nicht wäre behoben (oder zumindest in der UI der Jobkonfiguration geklärt).
Das Verhalten wird jedoch nicht bereitgestellt, wenn ein Maven-Build aus einer Jenkins-Jobvorlage erstellt wird, dh eine Vorlage verwendet wird, die nicht bereits für Maven vorkonfiguriert ist. Daher wird standardmäßig keine -Eigenschaft übergeben.
Der Leitfaden ist in der Tat nicht Artefakte bei Testfehler bereitstellen (die das Standardverhalten des maven-surefire-plugin
btw ist), die Sie auf unterschiedliche Weise angehen können:
- eine Freestyle-Jenkins Job-Vorlage und damit die volle Kontrolle über die Maven Ausführung bauen, obwohl auf einigen netten Vorkonfiguration aufgeben
- die Maven Jenkins Job halten und explizit die
-Dmaven.test.failure.ignore=false
Option als Teil des anfänglichen mvn clean deploy
Befehl
- Split der Auftrag in mehreren Build Schritten passieren ein d führt nur den nächsten aus, wenn der vorhergehende erfolgreich war (und nicht erfolgreich/instabil).Ein erster Schritt wäre der klassische
mvn clean install
, der dann einen nächsten Schritt zur Bereitstellung entweder über Maven (siehe nächstes) oder ein Jenkins-Plugin (es gibt Artifactory/Nexus Jenkins Plugin, die diese Aufgabe gut handhaben, mit dem direkten Vorteil von einfacheren Credentials und Repositories) Verwaltung für Snapshots/Releases und damit mehr Governance/Sicherheit auf CI-Seite, Entfernen von Rauschen aus der Datei pom.xml
oder aus den Maven-Einstellungen jedes Entwicklers).
den zusätzlichen Maven Schritt Betreffend die nur bereitstellen würde, auch einige Überlegungen, einige Punkte in den Kommentaren Adresse oben:
Es gibt eine relevante difference zwischen mvn deploy
und mvn deploy:deploy
, wo die erstere eine Maven Phase aufruft und daher in Kaskade each phase von validate
bis deploy
(daher compile
, test
, package
, zB) und jede mögliche Plugin-Ausführung in der Pom-Datei für eine bestimmte Phase konfiguriert; Letzterer ruft nur ein Ziel, das deploy
Ziel der maven-deploy-plugin
, mit dem offensichtlichen direkten Vorteil der Leistungen (es führt nur eine schnelle Aktion und nicht das ganze Build wieder) und Bedenken (es führt nur das durch, was wir eigentlich wirklich wollen Bühne).
Ja, Sie können Tests überspringen und die maven-jar-plugin
würde die Anwendung nicht erneut packen, z. B., und weitere Standard-Optimierung von Maven zur Verfügung gestellt, aber immer noch die erstere wäre viel langsamer und weniger korrekt.
Allerdings würde deploy:deploy
nicht funktionieren wegen fehlender Informationen im Maven-Buildkontext. Wenn man einfach den Ordner target
nicht genug auswählt, um zu ermitteln, was zu deployen ist, muss Maven wissen, welches Artefakt an den aktuellen Build angehängt wird. Die zusätzliche jar:jar
kommt in diesem Fall zur Rettung, nicht alles neu verpacken, aber einfach feststellen, was es verpackt werden sollte, es als ein Artefakt an den Build-Kontext anhängen und die maven-deploy-plugin
glücklich machen. Dieser Mechanismus wird auch in this Stack Overflow Antwort erklärt, wie bereits in den Kommentaren erwähnt.
Was ist Ihr CI-Server? Jenkins? Wie haben Sie sichergestellt, dass Testfehler ignoriert werden? Außerdem muss Ihr zweiter Schritt nicht die "deploy" -Phase aufrufen, es könnte einfach z.B. 'mvn jar: jar deploy: deploy' (da das Projekt ein jar war) wie [hier] erklärt (http://stackoverflow.com/a/38148135/5606016). Außerdem sollte es ein zusätzlicher CI-Jobschritt sein, kein Inline-'&&' -Befehl. –
Bereitstellung wird nicht funktionieren, wenn die Testphase fehlschlägt, müssen Sie etwas falsch in Ihrer Konfiguration haben –
Ja, es ist Jenkins. Es ist ein zusätzlicher CI-Jobschritt (daher habe ich analog zum Shell-Kommando gesagt). Und 'mvn deploy: deploy' entspricht" mvn deploy ". Ich bin mir nicht sicher, wie 'mvn jar: jar deploy: deploy' ist besser. Und nein, ich möchte nicht, dass Testfehler ignoriert werden. Ich überprüfte effektives Pom. Es scheint, dass es keine todsichere Plugin-Möglichkeit gibt, den Build bei Testfehlern zu beenden. –