Как остановить этап проверки Maven для восстановления артефакта? - PullRequest
5 голосов
/ 02 декабря 2010

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

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

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

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

Настроены два задания CI, каждое из которых указывает на ветку VCS проекта:

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

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

  • артефакт, созданный заданием 2, может не совпадать с артефактом, созданным заданием 1 (например, если за это время произошел новый коммит)
  • удлиняет цикл обратной связи для разработчика, который сделал коммит (т. Е. Им требуется больше времени, чтобы узнать, что они сломали сборку)
  • растрачивает ресурсы на сервере CI

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

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


В случае, если это кому-нибудь поможет, вот полный POM Maven 2 «проекта 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"), в противном случае никакие тесты не выполняются в фазе проверки.

Ответы [ 5 ]

4 голосов
/ 02 декабря 2010

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

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

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

Вы также можете подключиться к плагину Clone Workspace SCM. Это может предложить вам несколько дополнительных опций.

1 голос
/ 24 апреля 2017

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

mvn failsafe:integration-test

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

0 голосов
/ 10 ноября 2015

Профиль Maven, который выполняет только интеграционные тесты (, как предлагается здесь ), недостаточен. Вам также необходимо убедиться, что конфигурация maven-compiler-plugin имеет useIncrementalCompilation = 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>
0 голосов
/ 25 февраля 2015

Вы можете определить профиль 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

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

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

0 голосов
/ 02 декабря 2010

Итак, мой вопрос: как мне настроить задание 2 для использования артефакта, созданного заданием 1?нужно.Жизненный цикл Maven Build настроен так, чтобы соответствовать вашим потребностям.Жизненный цикл теста будет запускать только быстрые джунты.Пакет создает ваше конечное состояние без выполнения проверки.

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

...