Как остановить фазу проверки Мавена, восстанавливая артефакт?

StackOverflow https://stackoverflow.com/questions/4330518

Вопрос

Представьте себе проект Java, созданный с использованием Maven, для которого у меня есть:

  • Некоторые быстрые модульные тесты, которые:
    • Разработчики должны работать перед совершением
    • Мой сервер CI (Hudson, FWIW) должен работать при обнаружении нового коммита, давая почти мгновенную обратную связь в случае сбоев
  • Некоторые медленные автоматические тесты принятия, которые:
    • Разработчики могут работать, если они выберут, например, воспроизводить и исправить сбои
    • Мой CI -сервер должен работать после успешного запуска модульных тестов

Это кажется типичным сценарием. В настоящее время я бегаю:

  • модульные тесты на фазе «тестирования»
  • Приемные тесты на этапе «проверки»

Есть две задачи CI, настроенные, оба указывают на филиал VCS проекта:

  1. «Стадия коммита», которая запускает «пакет MVN» (компиляция и модульная проверка кода, создайте артефакт), который, если успешный, триггеры:
  2. «Автоматизированные приемные тесты», которые запускаются «MVN проверка» (настроить, запустить и разрушать тесты принятия)

Проблема заключается в том, что задание 2 модульные тестирование и создает тест на артефакт-младший снова и снова (потому что фаза проверки автоматически вызывает фазу пакета). Это нежелательно по нескольким причинам (в уменьшении важности):

  • Артефакт, созданный Job 2, может не быть идентичен тем, что создано работой 1 (например, если в то же время произошел новый коммит)
  • Удлиняет петлю обратной связи до разработчика, который совершил коммит (т.е. требуется больше времени, чтобы узнать, что они сломали сборку)
  • отходы ресурсов на сервере CI

Итак, мой вопрос: как я могу настроить Job 2 для использования артефакта, созданного Job 1?

Я понимаю, что у меня может быть одна работа CI, которая запускает «проверку MVN», которая создаст артефакт только один раз, но я хочу, чтобы отдельные задания CI описали выше, чтобы внедрить трубопровод развертывания в стиле Фарли.


В случае, если это помогает кому -либо, вот полный Maven 2 Pom «Проект 2» в принятом ответе:

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

Обратите внимание, что, несмотря на то, что этот проект «тесты» не создает артефакт, он должен использовать какую -то упаковку (я использовал здесь «JAR»), в противном случае тесты не выполняются на этапе проверки.

Это было полезно?

Решение

Попробуйте два проекта Maven. Первый содержит тесты на сборку и модуль. Вы устанавливаете артефакты в местный репозиторий. Вторая задание выполняет второй проект Maven, который объявляет артефакты первого проекта как зависимости и выполняет функциональные тесты.

Не уверен, возможен ли сценарий, который я только что описал, но я думаю, что это так.

Для быстрого улучшения вы можете обойти модульный тест с -Dmaven.test.skip=true. Анкет Если вы передаете номер ревизии вашего кода в SCM во вторую задачу, вы сможете проверить тот же исходный код.

Вы также можете зарегистрироваться в плагине Clone Workspace SCM. Это может предложить вам дополнительные варианты.

Другие советы

Я знаю, что это прошло много времени, но это хорошо понимается, и ни один из ответов не делает то, что спросили, но я нашел что-то, что работает:

mvn failsafe:integration-test

Это выполняет тесты напрямую, не проходя через все промежуточные этапы построения проекта. Вы можете добавить failsafe:verify после этого.

Итак, мой вопрос: как я могу настроить Job 2 для использования артефакта, созданного Job 1?

Вы не можете.

Тебе не нужно. А Maven Build Lifecycle Установка так, чтобы это звучало так, как будто он удовлетворит ваши потребности. Жизненный цикл испытаний будет управлять только быстрыми юнитами. Установите пакет свой конечный состояние без проверки.

Вам нужна только одна работа CI. Когда CI запускает ваш жизненный цикл Maven Deploy/установить, если Junits не выполняют сбое, сборка не выполняется, скрипты проверки не выполнятся.

Вы можете определить профиль Maven, который будет использоваться для выполнения только интеграционных тестов. Я много делаю.

Что-то вроде этого:

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

Вы бы вызвали это с:

mvn verify -Pintegration

К сожалению, военный плагин нельзя пропустить, но вы можете отправить его вывод куда -то выйти из дороги (я использовал /TMP). Если вы действительно хотите сохранить Milliseconds, вы также можете заставить его игнорировать веб -ресурсы (кроме Web.xml, это не будет работать без этого).

Вы также можете использовать профиль, чтобы пропустить любые другие плагины, которые вы можете запускать, например, плагин сборки, Cobertura, PMD и т. Д.

Профиль Maven, который выполняет только интеграционные тесты (как предложено здесь) недостаточно. Вы также должны убедиться, что конфигурация Maven-Compiler-Plugin имеет Использование INCREMENTALCOMPILATION = false. Анкет Запуск профиля таким образом, не будет автоматически переадресаться, например:

<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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top