#java #maven
#java #maven
Вопрос:
У меня есть несколько сложных тестов, которые используют автономные проекты Maven для проверки некоторого кода. Эти проекты Maven программно упаковываются тестами, и затем используются полученные .jar
файлы. В этих проектах используются артефакты из моего основного многомодульного проекта в текущей версии, в их pom.xml
. Другими словами, тестовые проекты Maven должны иметь возможность находить артефакты, предоставляемые моим основным проектом.
В IDE все работает нормально, поскольку текущие артефакты из моего основного проекта разрешаются динамически (локальный репозиторий не требуется) при запуске тестов. Кроме того, я могу установить эти версии МОМЕНТАЛЬНЫХ СНИМКОВ перед запуском тестов. Но когда я хочу выпустить новую версию своего проекта, мне нужно release:prepare
:
- Обновите версии (удалите все «-SNAPSHOT»).
- Запускает все тесты, которые не заканчиваются на
*.PostInstallTest.java
. - Упакуйте артефакты и установите их локально.
- ЗАТЕМ запускаются тесты, которые заканчиваются на
*.PostInstallTest.java
, поскольку для этих тестов требуется доступ к ранее установленным артефактам! Если тесты завершатся неудачей, никакие коммиты не будут нажатыrelease:prepare
.
Я знаю, что это не идеально, поскольку «плохая» версия артефактов может быть установлена локально, когда тесты «PostInstallTest» завершаются неудачей. Но я бы предпочел, чтобы эти тесты вообще не запускались!
В настоящее время моя единственная рабочая идея — установить системное свойство при использовании release
профиля и отключить *.PostInstallTest.java
файлы, если это свойство существует. Таким образом, эти тесты все равно будут работать при запуске внутри моей IDE (без release
профиля), но вообще не будут выполняться во время release:prepare
команды. Но, опять же, я хотел бы, чтобы они были выполнены.
Я просмотрел конфигурацию целей подготовки плагина Maven Release, но я не уверен, как это может мне помочь. Я также посмотрел на Maven Failsafe Plugin, но, похоже, он не поддерживает этап «установки».
Итак, мой вопрос: есть ли способ запустить некоторые тесты после фазы «установки», когда release:prepare
используется (или на этапе «установки», но после плагина по умолчанию)?
ОБНОВЛЕНИЕ: Вот краткая схема, если она может помочь понять, что происходит:
ОБНОВЛЕНИЕ 2: в конце концов, я не тестировал отказоустойчивость должным образом. Это работает на этапе «установки»! Посмотрите на ответ df778899.
Комментарии:
1. Будет ли приемлема дополнительная команда перед выпуском mvn: подготовка?
2. Я думаю, это действительно может быть решением! Я бы предпочел, если бы что-то было возможно без этого.
3.@Lesiak Какую команду вы бы предложили? Потому что тесты также выполняются
release:prepare
после того, как все-SNAPSHOT
были удалены из версий моих основных документов… Как я мог бы установить эти версии без моментальных снимков перед запускомrelease:prepare
, чтобы тесты без моментальных снимков могли их найти?4. Хорошо, я думаю, что теперь я понимаю проблему. Вы пробовали перенести отказоустойчивый плагин на этап установки? У плагина Failsafe есть фаза по умолчанию, но ее можно переопределять для каждого выполнения с помощью тега <phase>. Maven выполняет плагины для каждой фазы в порядке, в котором они определены в pom. Возможно, вам придется явно включить maven-install-plugin для принудительного упорядочивания на этапе установки
5. Как я уже говорил в своем описании, я пытался использовать Failsafe на этапе «установки», но он не хочет … 🙁
Ответ №1:
Проверьте следующую настройку. Он полагается на preparationGoals
для выполнения установки. В конфигурации плагина failsafe я настроил его для запуска на этапе установки.
Я полагаю, что варианты этого подхода также будут работать нормально — вы можете попробовать отменить привязку failsafe с любой фазы (для фазы установлено значение None) и явно вызвать ее в preparationGoals
(вероятно, для этого требуется дополнительная конфигурация, такая как идентификатор выполнения, но я думаю, что вы можете продолжить с этого момента).
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<preparationGoals>clean verify install</preparationGoals>
</configuration>
<dependencies>
<dependency>
<!-- Specify the version of maven-scm-plugin to avoid https://issues.apache.org/jira/browse/SCM-682
(Maven release fails when releasing from a named branch)
-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-scm-plugin</artifactId>
<version>1.9.5</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
Вывод (немного отредактированный для уменьшения шума) показывает, что проверки, запущенные preparationGoals
, выполняются после установки.
[INFO] --- maven-release-plugin:2.5.3:prepare (default-cli) @ demo ---
...
[INFO] Checking dependencies and plugins for snapshots ...
What is the release version for "demo"? (com.example:demo) 0.0.1: :
What is SCM release tag or label for "demo"? (com.example:demo) demo-0.0.1: :
What is the new development version for "demo"? (com.example:demo) 0.0.2-SNAPSHOT: :
[INFO] Transforming 'demo'...
[INFO] Not generating release POMs
[INFO] Executing goals 'clean verify install'...
[WARNING] Maven will be executed in interactive mode, but no input stream has been configured for this MavenInvoker instance.
[INFO] [INFO] Scanning for projects...
[INFO] [INFO]
[INFO] [INFO] --------------------------< com.example:demo >--------------------------
[INFO] [INFO] Building demo 0.0.1
[INFO] [INFO] --------------------------------[ jar ]---------------------------------
[INFO] [INFO]
[INFO] [INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ demo ---
[INFO] [INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ demo ---
[INFO] [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ demo ---
[INFO] [INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ demo ---
[INFO] [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ demo ---
[INFO] [INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ demo ---
[INFO] [INFO] --- maven-jar-plugin:3.1.1:jar (default-jar) @ demo ---
[INFO] [INFO] --- spring-boot-maven-plugin:2.1.4.RELEASE:repackage (repackage) @ demo ---
[INFO] [INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ demo ---
[INFO] [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ demo ---
[INFO] [INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ demo ---
[INFO] [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ demo ---
[INFO] [INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ demo ---
[INFO] [INFO] --- maven-jar-plugin:3.1.1:jar (default-jar) @ demo ---
[INFO] [INFO] Building jar: demo-0.0.1.jar
[INFO] [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ demo ---
[INFO] [INFO] Installing demo-0.0.1.jar to
[INFO] [INFO] --- maven-failsafe-plugin:2.22.1:integration-test (default) @ demo ---
[INFO] [INFO]
[INFO] [INFO] --- maven-failsafe-plugin:2.22.1:verify (default) @ demo ---
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] BUILD SUCCESS
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Total time: 13.784 s
[INFO] Checking in modified POMs...
Ответ №2:
Я не думаю, что это ответ на данный момент, но, чтобы расширить точку зрения @Lesiak, плагин Failsafe сам по себе отлично выглядит на этапе установки. Например:
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
Результаты в этом выводе:
...
[INFO] --- maven-install-plugin:2.4:install (default-install) @ it-test ---
[INFO] Installing ...targetit-test-0.0.1-SNAPSHOT.jar to ....m2repositorygroupit-test0.0.1-SNAPSHOTit-test-0.0.1-SNAPSHOT.jar
[INFO] Installing ...pom.xml to ....m2repositorygroupit-test0.0.1-SNAPSHOTit-test-0.0.1-SNAPSHOT.pom
[INFO]
[INFO] --- maven-failsafe-plugin:3.0.0-M3:integration-test (default) @ it-test ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TheIT
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.093 s - in TheIT
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-failsafe-plugin:3.0.0-M3:verify (default) @ it-test ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
Обратите внимание, как цели maven-failsafe-plugin:3.0.0-M3:integration-test
и maven-failsafe-plugin:3.0.0-M3:verify
выполняются в конце — на install
этапе.
Комментарии:
1. Фаза «проверки» находится перед фазой «установки»: maven.apache.org/guides/introduction/… . Отказоустойчивый плагин не поддерживает этап «установки», выдается ошибка.
2. Как вы говорите, по умолчанию
verify
цель в отказоустойчивом плагине обычно выполняется наverify
этапе жизненного цикла Maven. Настройка<phase>install</phase>
на отказоустойчивый плагин должна переместитьverify
цель (иintegration-test
цель, если на то пошло) вinstall
фазу. Я обновил ответ, чтобы, надеюсь, сделать это более понятным. Можете ли вы подробнее рассказать об ошибке, которая выдается?3. Я исправлен. Отказоустойчивость действительно работает должным образом на этапе «установки»! Я думаю, что я тестировал с чем-то глупым, например,
<role>install</role>
вместо<phase>install</phase>
. Я все равно оставлю свой вопрос на случай, если это поможет кому-то в будущем. Наслаждайтесь щедростью и большой благодарностью от меня!