"Правильный" способ -- использование профилей в maven.
Подробнее проконсультировал Антона (коллегу Игоря) в привате, в скайпе.
Если будут силы и время -- напишите потом, как всё сделали :)
"Правильный" способ -- использование профилей в maven.
Подробнее проконсультировал Антона (коллегу Игоря) в привате, в скайпе.
Если будут силы и время -- напишите потом, как всё сделали :)
С Maven не работаю, но билд файлы того же Ant'a отлично видят переменные окружения Jenkins'a. Напишите скрипт (на любом языке, если конечно не важна кроссплатформенность), который получит на входе параметры браузера и вставит в XML. А затем заэкзекьютьте его из того же билд файла, до запуска testng сьюта.
Реализовали с использованием профилей Maven, согласно рекомендации Алексея Баранцева.
Значения параметров передаются теперь по следующей цепочке: Job (in Jenkins)->Profiles (in Maven)->Property file->Java code
Вопрос решен.
Спасибо за помощь.
Расскажите, пожалуйста, более подробно о данном способе.
1. Создаем параметризированный Job.
1.1 Создаем параметр. Пусть имя параметра будет TEST_PARAM типа String.
1.2 В Build->Goals and options указываем команду для запуска Maven с именем будущего профиля:
clean test -P my_profile
где:
my_profile - имя вашего профиля.
1.3 Сохраняем Job.
2. Создаем профиль my_profile в pom.xml:
...
<profiles>
<profile>
<id>my_profile</id>
<properties>
<test.param>${env.TEST_PARAM}</test.param>
</properties>
</profile>
</profiles>
...
где:
my_profile - имя профайла (может быть любым)
test.param - имя параметра в файле .properties, который будет принимать параметр
${env.TEST_PARAM} - имя переменной окружения, в которой хранится значение параметра (TEST_PARAM - имя параметра из Job'a)
3. В проекте создаем файл .properties, который будет принимать параметр из профиля Maven:
test.param=${test.param}
4. Считываем данные из файла .properties там, где это нужно и используем по назначению)
Итого, схема передачи параметра выглядит следующим образом.
Job parameter -> Maven profile -> Property file -> Java class
Здравствуйте.
Окружение: Maven + Java + JUnit + Allure + REST
Задача: надо выбирать в Jenkins какие-то параметры (домены) для запуска тестов (.ru or .com) и чтобы урлы в тестах изменялись в зависимости от выбранного параметра
Пытаюсь подружить Jenkins c Maven. Делаю все как описано в коменте выше, но Maven подчеркивает строку красным.
properties>
select.domain>${env.DOMAIN}</select.domain
/properties>
В Jenkins создал параметр и запускаю через него же.
<===[JENKINS REMOTING CAPACITY]===>channel started
Executing Maven: -B -f /var/lib/jenkins/jobs/am-tests-back-temp/workspace/pom.xml clean test -P select_domain
[INFO] Scanning for projects…
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building am-statuscode-desk 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] — maven-clean-plugin:2.5:clean (default-clean) @ am-statuscode-desk —
[INFO] Deleting /var/lib/jenkins/jobs/am-tests-back-temp/workspace/target
[INFO]
[INFO] — maven-resources-plugin:2.6:resources (default-resources) @ am-statuscode-desk —
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /var/lib/jenkins/jobs/am-tests-back-temp/workspace/src/main/resources
[INFO]
[INFO] — maven-compiler-plugin:3.5.1:compile (default-compile) @ am-statuscode-desk —
[INFO] No sources to compile
[INFO]
[INFO] — maven-resources-plugin:2.6:testResources (default-testResources) @ am-statuscode-desk —
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /var/lib/jenkins/jobs/am-tests-back-temp/workspace/src/test/resources
[INFO]
[INFO] — maven-compiler-plugin:3.5.1:testCompile (default-testCompile) @ am-statuscode-desk —
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 5 source files to /var/lib/jenkins/jobs/am-tests-back-temp/workspace/target/test-classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /var/lib/jenkins/jobs/am-tests-back-temp/workspace/src/test/java/statusMainPageTest.java:[3,44] package com.sun.xml.internal.fastinfoset.sax does not exist
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.454 s
[INFO] Finished at: 2016-07-18T15:10:02+03:00
[INFO] Final Memory: 25M/166M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.5.1:testCompile (default-testCompile) on project am-statuscode-desk: Compilation failure
[ERROR] /var/lib/jenkins/jobs/am-tests-back-temp/workspace/src/test/java/statusMainPageTest.java:[3,44] package com.sun.xml.internal.fastinfoset.sax does not exist
[ERROR] → [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] MojoFailureException - Apache Maven - Apache Software Foundation
[JENKINS] Archiving /var/lib/jenkins/jobs/am-tests-back-temp/workspace/pom.xml to ru.am.rambler.autotests/am-statuscode-desk/1.0-SNAPSHOT/am-statuscode-desk-1.0-SNAPSHOT.pom
channel stopped
Ваша ошибка никак не связана с переменными окружения.
П.С. Подчеркивает правильно, т.к. maven ничего не знает о вашей переменной, установленной на уровне Jenkins. Но сборке это никак не помешает, т.к. значение переменной прилетит в рантайме. Для начала разберитесь с ошибками компиляции.
Спасибо большое.
Что-то совсем заработался…
Попробовал сделать все как в примере GarikRocks, но значение из Jenkins так и не приходит.
Вместо этого в URL подставляется “маска” (${***})
Подскажите пожалуйста в чем может быть дело?
Вам нужно включить фильтрацию ресурсов в pom, чтобы иметь возможность подставлять значения в properties вместо placeholder’ов.
А не могли бы вы более конкретно подсказать как это сделать?
Добавил в билд resource, но тоже не работает.
Файл POM
<profiles> <profile> <id>select_domain</id> <properties> <test.param>${env.TEST_PARAM}</test.param> </properties> </profile> </profiles>
<properties> <allure.version>1.4.23</allure.version> <aspectj.version>1.8.9</aspectj.version> <htmlelement.version>1.17</htmlelement.version> <selenium.version>2.53.0</selenium.version> </properties>
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.21</version> </dependency>
<dependency> <groupId>com.github.detro.ghostdriver</groupId> <artifactId>phantomjsdriver</artifactId> <version>1.0.4</version> </dependency> <dependency> <groupId>ru.yandex.qatools.allure</groupId> <artifactId>allure-junit-adaptor</artifactId> <version>${allure.version}</version> </dependency> <dependency> <groupId>com.jayway.restassured</groupId> <artifactId>rest-assured</artifactId> <version>2.9.0</version> <scope>test</scope> </dependency>
</dependencies>
<reporting> <excludeDefaults>true</excludeDefaults> <plugins> <plugin> <groupId>ru.yandex.qatools.allure</groupId> <artifactId>allure-maven-plugin</artifactId> <version>2.5</version> </plugin> </plugins> </reporting>
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine> <properties> <property> <name>listener</name> <value>ru.yandex.qatools.allure.junit.AllureRunListener</value> </property> </properties> </configuration> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> </dependencies> </plugin> </plugins> </build>
Так а вы профайл указали при сборке? Если вы не задали условие активации, вы должны явно вызывать соответствующий профиль.
И еще, как в пропертях обращаетесь к переменной?
Ответ:
В Jenkins в Goals была добавлена строка:
install -D DOMAIN=${DOMAIN}
В Jenkins был добавлен параметр Choice Param:
Name: DOMAIN
С двумя вариантами выбора
В pom.xml была добавлена строка:
<properties> <test.param>${env.DOMAIN}</test.param> </properties>
В Java в нужном месте вызывается с помощью:
System.getProperty(“DOMAIN”)
Всем спасибо!
Если задача стояла в чтении Jenkins переменной из java кода, минуя проперти, то все делается гораздо проще.
Это именно то что нужно, работает на УРА.
Спасибо Роман!!!
Привет всем!
Делал по примеру, как в этой теме.
Первое что мне необходимо, вынести в Jenkins выбор тестового окружения, на котором будут запущены автотесты
Смущает момент:
из комментов выше, я правильно понимаю, что переменная ${env.DOMAIN} будет всегда подсвечиваться красным как ошибка в pom.xml и это нормально, и делать с этим ничего не нужно??
и второй вопрос:
правильно ли я понимаю, что в коде достаточно сделать вот так, чтобы достать значение переменной DOMAIN , которое будет передаваться из Jenkinsa и использоваться далее в коде для формирования полных урлов страниц ?
очень нужна помощь и консультация по текущему вопросу, т.к. никогда прежде этого не делал и последние несколько дней не могу закончить прикручивание тестов в Jenkins
Для того, чтобы проверить вашу теорию, Jenkins совсем не нужен. IntelliJ, которую вы используете, позволяет просетить переменные окружения в run / debug configuration. Что мешает вам запустить maven профайл из идеи с нужной переменной DOMAIN
, и посмотреть результат?
Jenkins ничего нового - в плане переменных окружения - не делает.
P.S. А вообще, подсказочки можно найти и путем поиска по форуму. Уже были темы и о maven профайлах, и о переменных окружения и о параметризации различных конфигураций.
Можно отключить warning, если он так напрягает:
<!--suppress UnresolvedMavenProperty -->
Для чего вам профили в мавене? Настройку через env или properties можно и без них прочитать и передать.
можно наверное, я еще до конца не вник и нет понимания как это взаимосвязано работает. Поэтому и начал задавать вопросы тут. Буду благодарен за объяснение / примеры!
Добавил переменную окружения domain, но она не подтягивается в код.
POM:
.properties:
Переменные окружения:
и
Java class:
При загрузке страницы для любого теста происходит обращение через экземпляр класса environment и получение базового домена, к которому потом добавляются endPoints урлов страниц сайта.
Запускаю через IDE run иконку.
при дебаге вижу что там null.
если запускаю вот так:
mvn clean test -Dsurefire.suiteXmlFiles=testng.xml -DDOMAIN=http://
то домен видит и подтягивает доменное имя, записывает и урлы формируются корректно.
Может кто-то подсказать, что неправильно сделал, почему только через указание параметра в консоли работает ??
Потому что в properties pom файла задаются параметры для этого pom, если не задано иное в плагине. От того что вы из env параметра запишете в pom переменную, то она не появится в System.getProperties()
. Параметры env можно вычитывать через System.getenv(name);
Так же можно передавать не через env, указав в параметрах запуска ключ -D”имя параметра”=“значение параметра”, тогда в System.getProperty(name);
можно вычитать этот параметр. В обоих случаях задавать профиль и properties в pom-файле нет необходимости.