2016-07-20 12 views
1

Ich bin ein langer Zeit Benutzer der maven-release-plugin, die nicht freigibt (alias deploy jars zu maven Repo), wenn es Unit-Test-Fehler gibt.Keeping das Mave Deploy-Plugin von der Bereitstellung bei Testfehlern

Aus verschiedenen Gründen möchte ich nur das Maven-Deploy-Plugin verwenden, aber scheinbar wird es trotzdem bereitstellen, selbst wenn es Testfehler in der maven-surefire-plugin gibt.

Folglich statt nur

mvn clean deploy 

muss ich mein CI-Setup einen zweistufigen analog zu (Shell) zu tun:

mvn clean test && mvn deploy -DskipTests=true 

Ich habe dafür gesorgt, todsichere nicht Fehler ignorieren gesetzt. Idealerweise möchte ich nicht zwei getrennte Prozesse ausführen.

Natürlich kann die Bereitstellung bei Testfehlern nicht die Standardeinstellung sein? Fehle ich etwas?

EDIT erscheint es Jenkins Thema sein .. Kann nicht reproduzieren

Ich bin nicht sicher, warum oder wie Jenkins das Maven-Build-Kräfte, die auf Testfehler fortzusetzen (ich nehme für die Meldung ist) aber es zeigt keine der Optionen an, die weitergegeben werden, damit es fortgesetzt werden kann. Es scheint nur zu passieren, wenn Jenkins sagt "Module geändert, Neuberechnung von Abhängigkeitsgraphen".

+0

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. –

+0

Bereitstellung wird nicht funktionieren, wenn die Testphase fehlschlägt, müssen Sie etwas falsch in Ihrer Konfiguration haben –

+0

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. –

Antwort

4

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.