Maven, Jenkins-как построить проект в разных тестовых средах?

у меня есть проект Java, содержащий тесты junit, которые нужно запускать в разных тестовых средах (Dev, Staging и т. д.) через Дженкинса.

как я могу настроить построение проекта в разных средах и как передать url, имя пользователя и пароль maven?

могу ли я использовать профили maven 3 для чтения url-адреса среды, имени пользователя и пароля из файла свойств?

Edit: я добавил профили в проект Пом:

<profiles>
        <profile>
            <id>Integration</id>
        </profile>
        <profile>
            <id>Staging</id>
        </profile>
        <profile>
            <id>PP1</id>
        </profile>
        <profile>
            <id>PP2</id>
        </profile>
        <profile>
            <id>PP3</id>
        </profile>
</profiles>

как передать url, имя пользователя и пароль в эти профили?

В настоящее время тесты получают сведения о тестовой среде из файла свойств:

 public  class BoGeneralTest extends TestCase {

    protected WebDriver driver;
    protected BoHomePage boHomePage;
    protected static Properties systemProps;
    String url = systemProps.getProperty("Url");
    String username = systemProps.getProperty("Username");
    String password = systemProps.getProperty("Password");
    int defaultWaitTime = Integer.parseInt(systemProps.getProperty("waitTimeForElements"));

    static {
        systemProps = new Properties();
        try {
            systemProps.load(new FileReader(new File("src/test/resources/environment.properties")));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Edit 2:

изменение, реализованное в классе Test runner:

public class BoGeneralTest extends TestCase {

    protected WebDriver driver;
    protected BoHomePage boHomePage;
    protected static Properties systemProps;
    String url = systemProps.getProperty("Url");
    String username = systemProps.getProperty("Username");
    String password = systemProps.getProperty("Password");
    int defaultWaitTime = Integer.parseInt(systemProps.getProperty("waitTimeForElements"));
    String regUsername = RandomStringUtils.randomAlphabetic(5);

    final static String appConfigPath = System.getProperty("appConfig");

    static {
        systemProps = new Properties();
        try {

            systemProps.load(new FileReader(new File(appConfigPath)));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

5 ответов


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

в вашем POM укажите профиль, который ссылается на файл свойств с вашими свойствами в:

<profiles>
    <profile>
        <id>staging</id>
        <properties>
            <app.config>/your/path/to/app.staging.properties</app.config>
        </properties>
    </profile>
</profile>

затем вы можете передать это в свою конфигурацию Surefire:

<plugins>
    <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <systemPropertyVariables>
                <appConfig>${app.config}</appConfig>
            </systemPropertyVariables>
        </configuration>
    </plugin>
</plugins>

из тестов вы можете загрузить содержимое файла свойств, например:

final String appConfigPath = System.getProperty("appConfig");
// Load properties etc...

на самом деле, вы могли бы сделать еще один шаг вперед... полностью сбросьте профили Maven и просто укажите -DappConfig=/your/path/to/app.staging.properties в вас Дженкинс построить конфигурацию.


вы можете настроить профили maven и выбрать, какой из них активен, используя-P flag


почему бы не использовать Maven построить профили, так как вы можете указывать <properties> в профиле указать различные узлы сборки и т. д. Просто сделай!--5-->

$ mvn -Pstaging

(скажем), чтобы включить промежуточный профиль.

см. руководство по Sonatype на Построить Профили для получения дополнительной информации.


здесь я использую скрипты bash для развертывания созданного артефакта Дженкинса в Glassfish.

sudo /usr/share/glassfish3/glassfish/bin/asadmin --user admin --passwordfile /root/.asadminpass undeploy PROJECT_NAME
sudo /usr/share/glassfish3/glassfish/bin/asadmin --user admin --passwordfile /root/.asadminpass deploy $WORKSPACE/PROJECT_NAME/target/PROJECT_NAME.war

Не используйте профили сборки Maven для этого!

Это заставляет вас фактически изменить свою сборку для разных сред.

вместо этого сделайте свои тесты и, вероятно, ваше приложение настраиваемым. Основная идея состояла бы в том, чтобы прочитать детали конфигурации (например, URL-адреса базы данных) из некоторых системных свойств. Что, в свою очередь, можно легко указать в конфигурациях заданий Jenkins

для более сложных сценариев вы можете указать классы, которые будут использоваться для цель из системных свойств, например, если вы хотите MockedImplementation для среды Dev и реальной вещи в QA.

Если вы используете Spring, посмотрите на профили Spring, которые очень хорошо поддерживают этот вид вещей.

Если вам это нужно только в тестах, вы должны иметь возможность инкапсулировать этот вид вещей в Правила JUnit.