Wie zu stoppen Maven der verify-phase den Wiederaufbau der Artefakt?
Vorstellen, ein Java-Projekt erstellt unter Verwendung von Maven für die ich habe:
- einigen schnell ausgeführten unit-tests, die:
- Entwickler ausgeführt werden soll, bevor
- mein CI-server (Hudson, FWIW) laufen soll beim erkennen einer neuen übergabe (commit), so dass nahezu sofortiges feedback bei Fehlern
- einige langsame Ausführung von automatisierten Akzeptanz tests:
- Entwicklern ausgeführt werden können, wenn Sie wollen, z.B. zum reproduzieren und beheben von Fehlern
- mein CI-server laufen soll, nach dem erfolgreichen ausführen der unit-tests
Dies scheint ein typisches Szenario. Aktuell habe ich ausgeführt:
- die unit-tests in der "test" - phase
- die Abnahmeprüfungen in der "überprüfen" - phase
Gibt es zwei CI-jobs konfiguriert, beide zeigen auf das Projekt VCS Branche:
- "Commit Phase", die läuft "mvn package" (compile-und unit-test-code, um das Artefakt), die, wenn erfolgreich, Trigger:
- "Automated Acceptance Tests", die läuft "mvn verify" (einrichten, ausführen, reißen die Akzeptanz-tests)
Das problem ist, dass job 2 unit-tests und builds die Artefakt-unter-test-wieder alles vorbei (weil der verify-phase automatisch startet das Paket-phase). Dies ist unerwünscht, aus mehreren Gründen (in Abnehmender Bedeutung):
- das Artefakt erstellt von Aufgabe 2 kann nicht identisch zu sein erstellt von job 1 (z.B., wenn es einen neuen commit, der in der Zwischenzeit)
- verlängert die feedback-Schleife, um die Entwickler, die aus der commit (d.h. länger dauert, bis Sie zu finden Sie heraus, brach Sie das bauen)
- verschwendet Ressourcen auf dem CI-server
Also meine Frage ist, wie kann ich das konfigurieren von job 2 zu verwenden das Artefakt, geschaffen von job 1?
Ich realisieren konnte ich nur noch ein CI-job, der läuft "mvn verify", die würde das Artefakt nur einmal, aber ich wollen, das separate CI-jobs oben beschrieben, um zu implementieren ein Farley-Stil deployment pipeline.
Falls es jemand hilft, hier die komplette Maven 2 POM des "Projekt 2" in der akzeptierten Antwort:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.cake</groupId>
<artifactId>cake-acceptance</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>Cake Shop Acceptance Tests</name>
<description>
Runs the automated acceptance tests for the Cake Shop web application.
</description>
<build>
<plugins>
<!-- Compiler -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<!-- Suppress the normal "test" phase; there's no unit tests -->
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<!-- Cargo (starts and stops the web container) -->
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.0.5</version>
<executions>
<execution>
<id>start-container</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>stop-container</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- Don't wait for CTRL-C after starting the container -->
<wait>false</wait>
<container>
<containerId>jetty7x</containerId>
<type>embedded</type>
<timeout>20000</timeout>
</container>
<configuration>
<properties>
<cargo.servlet.port>${http.port}</cargo.servlet.port>
</properties>
<deployables>
<deployable>
<groupId>${project.groupId}</groupId>
<artifactId>${target.artifactId}</artifactId>
<type>war</type>
<properties>
<context>${context.path}</context>
</properties>
</deployable>
</deployables>
</configuration>
</configuration>
</plugin>
<!-- Failsafe (runs the acceptance tests) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
</goals>
</execution>
<execution>
<id>verify</id>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
<skipTests>false</skipTests>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- Add your tests' dependencies here, e.g. Selenium or Sahi,
with "test" scope -->
<dependency>
<!-- The artifact under test -->
<groupId>${project.groupId}</groupId>
<artifactId>${target.artifactId}</artifactId>
<version>${target.version}</version>
<type>war</type>
</dependency>
</dependencies>
<properties>
<!-- The artifact under test -->
<target.artifactId>cake</target.artifactId>
<target.version>0.1.0-SNAPSHOT</target.version>
<context.path>${target.artifactId}</context.path>
<http.port>8081</http.port>
<java.version>1.6</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
Beachten Sie, dass, obwohl diese "tests" - Projekt nicht schaffen, ein Artefakt, es zu verwenden hat einige Art der Verpackung (ich habe "jar" hier), sonst keine Prüfungen laufen in der verify-phase.
- Nur für diejenigen, die wollen, um besser zu verstehen, der Ansatz, siehe Continuous Delivery von Jez Humble und David Farley.
- Genau das Buch, das dazu aufgefordert diese Mühe! Lohnt sich der Preis.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, zwei maven-Projekte. Die erste enthält die build-und unit-tests. Sie installieren die Artefakte im lokalen repository. Der zweite job läuft die zweite maven-Projekt, welches erklärt die Artefakte der ersten Projekt-Abhängigkeiten und führt die funktionale tests.
Nicht sicher, ob das eben beschriebene Szenario ist möglich, aber ich denke, es ist.
Für eine schnelle Verbesserung, die Sie umgehen können, den unit-test mit
-Dmaven.test.skip=true
. Wenn Sie übergeben die revision Nummer des Codes in der scm zum zweiten job, Sie sollten in der Lage sein, um eine Arbeitskopie der gleichen source-code.Können Sie auch überprüfen, in der Klon-Arbeitsbereich-SCM-plugin. Dies könnte Ihnen einige weitere Optionen.
Ich weiß, es ist schon eine lange Zeit, aber das ist gut indiziert und keine der Antworten, die tun, was gefragt wurde, aber ich habe etwas gefunden, das funktioniert:
Dieser führt die tests direkt, ohne Umweg über alle Zwischenschritte über das Projekt zu erstellen. Sie wollen
failsafe:verify
nach.Können Sie nicht.
Brauchen Sie nicht. Die Maven-Build-lifecycle ist setup in einer Weise, die klingt wie es Ihren Anforderungen gerecht wird. Der Testzyklus wird nur das schnelle junits. Paket bauen Sie Ihre end-Zustand, ohne läuft die überprüfung.
Benötigen Sie nur ein CI-job. Wenn das CI läuft Ihr die maven deploy/install-Lebenszyklus, wenn die junits scheitern der build fehlschlägt, wird die Prüfung Skripte nicht ausführen.
Können Sie definieren ein Maven-Profil aus, das verwendet werden, um die Ausführung der Integrationstests. Ich mache das viel.
Etwas wie dieses:
Aufgerufen wird es mit:
Leider KRIEG-plugin kann nicht übersprungen werden, aber Sie können seine Leistung senden, um irgendwo aus dem Weg (ich habe /tmp). Wenn Sie wirklich wollen, um zu speichern Millisekunden, Sie könnte auch helfen, ignorieren Sie die web-Ressourcen (außer web.xml funktioniert es nicht, ohne dass).
Können Sie auch das Profil zu überspringen, alle anderen plugins, die Sie möglicherweise ausgeführt werden, z.B. das assembly-plugin, Cobertura, PMD, etc.
Maven-Profil, das führt nur die integration tests (wie hier vorgeschlagen) ist nicht ausreichend. Sie müssen auch sicherstellen, dass die Konfiguration der maven-compiler-plugin hat useIncrementalCompilation = false. Läuft das Profil auf diese Weise, werden Sie nicht automatisch neu kompiliert werden, z.B.: