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:

  1. "Commit Phase", die läuft "mvn package" (compile-und unit-test-code, um das Artefakt), die, wenn erfolgreich, Trigger:
  2. "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.
InformationsquelleAutor Andrew Swan | 2010-12-02
Schreibe einen Kommentar