Frage

Stellen Sie sich ein Java-Projekt Maven gebaut mit, für die ich habe:

  • einige schnell laufenden Unit-Tests, dass:
    • Entwickler vor der Festlegung laufen sollte
    • mein CI-Server (Hudson, FWIW) ein neues Commit beim Erfassen ausgeführt werden soll, fast sofortiges Feedback bei Störungen geben
  • einige langsamlaufende automatisierte Akzeptanztests, dass:
    • können Entwickler führen, wenn sie wählen, zum Beispiel zu reproduzieren und fix Ausfälle
    • mein CI-Server soll nach dem erfolgreichen Ausführen der Unit-Tests ausführen

Dies scheint ein typisches Szenario. Derzeit bin ich ausgeführt wird:

  • die Unit-Tests in der "Testphase"
  • Die Abnahmetests in der Phase "überprüfen"

Es gibt zwei CI Jobs konfiguriert, beide Unter Hinweis auf die VCS Zweig des Projekts:

  1. "Stage Commit", die "mvn package" (der Code der Kompilierung und Unit-Test, bauen das Artefakt) läuft, die, wenn sie erfolgreich ist, Trigger:
  2. "Automatisierte Acceptance Tests", die läuft "MVN überprüfen" (einrichten, laufen und abzureißen die Abnahmetests)

Das Problem ist, dass Job 2 Unit-Tests und baut die Artefakt-under-Test noch einmal (weil die Phase überprüft automatisch das Paket Phase aufruft). Dies ist aus mehreren Gründen unerwünscht (in abnehmender Bedeutung):

  • der von Job erstellt Artefakt 2 möglicherweise nicht identisch sein, dass durch Arbeit geschaffen 1 (zum Beispiel, wenn es ein neues begeht in der Zwischenzeit ist)
  • verlängert die Rückkopplungsschleife zu dem Entwickler, der aus der Commit (das heißt länger dauert, sie sie, um herauszufinden, brach das Build)
  • Abfälle Ressourcen auf dem CI-Server

Also meine Frage ist, wie kann ich konfigurieren Job 2 das Artefakt von Job 1 erstellt benutzen?

Ich weiß, ich nur einen CI Job haben könnte, dass runs „MVN verifizieren“, die das Artefakt schaffen würde nur einmal, aber ich mag die einzelnen CI Jobs oben beschrieben, um einen Farley-Stil Einsatz zur Umsetzung Pipeline.


Im Fall hilft es jemand, hier ist die volle Maven 2 POM von "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 dieses „Tests“ Projekt schafft nicht einen Artefakt, hat es eine Art zu verwenden, die Verpackung (I used „jar“ hier), da ansonsten keine Tests sind in der Verifizierungsphase ausgeführt werden.

War es hilfreich?

Lösung

Versuchen Sie, zwei Maven-Projekte. Die erste enthält den Aufbau und Komponententests. Sie installieren die Artefakte in Ihrem lokalen Repository. Der zweite Job läuft das zweite Maven-Projekt, das das Artefakte des ersten Projektes als Abhängigkeiten erklärt und führt die Funktionstests.

Nicht sicher, ob das Szenario, das ich gerade beschrieben ist möglich, aber ich denke, es ist.

Für eine schnelle Verbesserung können Sie den Unit-Test mit -Dmaven.test.skip=true umgehen. Wenn Sie die Versionsnummer Ihres Codes in Ihrem scm auf den zweiten Job übergeben, sollten Sie in der Lage sein, den gleichen Quellcode zur Kasse.

Sie können auch die Clone Workspace SCM-Plugin Check in. Das könnte Sie einige zusätzliche Optionen bieten.

Andere Tipps

Ich weiß, es war eine lange Zeit, aber das ist gut indiziert und keine der Antworten tun, was gefragt wurde, aber ich habe etwas gefunden, das funktioniert:

mvn failsafe:integration-test

Dies führt die Tests direkt, ohne alle zu gehen durch die Zwischenschritte Erstellen des Projekts. Möglicherweise möchten Sie failsafe:verify nachdem es hinzuzufügen.

  

Also meine Frage ist, wie kann ich konfigurieren   Job 2 das Artefakt erstellt zu verwenden, indem   Job 1?

Sie können es nicht.

Sie brauchen nicht zu. Der Maven Build-Lebenszyklus Setup, dass Töne in einer Art und Weise ist wie wird es Ihre Bedürfnisse erfüllen. Der Testzyklus wird nur die schnellen junits laufen. Paket baut Ihren Endzustand ohne die Überprüfung ausgeführt wird.

Sie benötigen nur einen CI Job. Wenn die CI Ihre Maven deploy läuft / Lebenszyklus installieren, wenn die junits nicht die Build fehlschlägt, wird die Verifikations Skripte nicht ausgeführt werden.

Sie können ein Maven Profil definieren, die verwendet werden, werden nur die Integrationstests auszuführen. Ich tue dies sehr.

So etwas wie folgt aus:

<profiles>
    <profile>
        <id>integration</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId><version>2.17</version>
                    <configuration>
                        <skipTests>true</skipTests>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId><version>2.4</version>
                    <configuration>
                        <outputDirectory>/tmp</outputDirectory>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

Sie würden rufen diese mit:

mvn verify -Pintegration

Leider kann die WAR-Plugin nicht übersprungen, aber man seine Ausgabe an irgendwo aus dem Weg schicken kann (ich verwendet habe, / tmp). Wenn Sie wirklich sparen Millisekunden möchten, können Sie es auch die Web-Ressourcen ignorieren (außer web.xml, es wird nicht funktionieren, ohne dass).

Sie können auch das Profil verwenden, um alle anderen Plugins zu überspringen, dass Sie vielleicht laufen, wie zB die Montage-Plugin, Cobertura, PMD, etc.

Maven Profil, das ausgeführt wird nur die Integrationstests ( wie hier vorgeschlagen) ist nicht ausreichend. Sie müssen auch sicherstellen, dass die Konfiguration von maven-Compiler-Plugin hat useIncrementalCompilation = false . Das Ausführen des Profil Auf diese Weise werden nicht automatisch neu kompilieren, z.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.3</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <useIncrementalCompilation>false</useIncrementalCompilation>
    </configuration>
</plugin>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top