Как определить, что мой тест выполняется в среде Jenkins? - PullRequest
0 голосов
/ 02 июля 2018

У меня есть тест JUnit, использующий Assumption, чтобы пропустить тест, если на компьютере разработчика нет необходимого программного обеспечения для его запуска. Несмотря на то, что это «джунит», это интеграционный тест. Как то так:

int isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor();
Assume.assumeThat("Software not present", isSoftwarePresent, is(equalTo(0)));

Однако в какой-то момент я понял, что тест остановил запуск на автоматизированной сборке на Jenkins из-за этого предположения, и в конечном итоге была введена регрессия, которую тест должен был остановить.

Другими словами, в ведомой среде Jenkins пропало необходимое программное обеспечение, что привело к пропуску теста.

Автоматический тест запускается maven с плагином FailSafe в плане сборки Jenkins Pipeline. Как я могу определить, что моим окружением является Дженкинс, чтобы я мог сделать условие предположения более строгим?

То есть я хочу, чтобы условие было примерно таким:

boolean isJenkinsBuild = /* true if this is being run inside a Jenkins build, false otherwise */;
boolean isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor() == 0;
Assume.assumeTrue("Software not present", isSoftwarePresent || isJenkinsBuild);

Или даже,

@Test
void testJenkinsEnvironment() {
    ...
    Assume.assumeTrue(isJenkinsBuild);
    Assert.assertTrue(isSoftwarePresent);
}

@Test
void testFeature() {
    ...
    Assume.assumeTrue(isSoftwarePresent);
    ...
}

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Поскольку их легко тестировать и передавать в каждую программу, выполняемую при сборке, я решил основывать проверку на переменных среды.

Хотя ответ rohit показывает один из способов установки переменных в Jenkinsfile, я бы предпочел полагаться на то, что делает сам Jenkins, поэтому я проверил переменные среды, заданные в моих заданиях Jenkins, и есть много вариантов на выбор:

Общая информация Дженкинса

Они кажутся постоянными в экземпляре Дженкинса.

  • HUDSON_URL
  • JENKINS_URL

Не относится к Дженкинсу, но также полезно следующее:

  • USER

Наш Jenkins работает под пользователем jenkins, поэтому тестирование этого значения также возможно.

Информация о работе

Они имеют постоянные значения в сборках для одного и того же задания.

  • JOB_URL
  • JOB_NAME
  • JOB_BASE_NAME
  • JOB_DISPLAY_URL

Информация о сборке

Они имеют постоянные значения для одной и той же сборки (то есть для разных sh вызовов).

  • BUILD_URL
  • BUILD_TAG
  • RUN_CHANGES_DISPLAY
  • RUN_DISPLAY
  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • BUILD_NUMBER

Информация об узле

Они относятся к узлу, на котором выполняется текущая команда.

  • JENKINS_HOME
  • JENKINS_NODE_COOKIE
  • NODE_LABELS
  • NODE_NAME

Special

Этот меняется с каждой сборкой, может меняться от узла к узлу и даже может меняться с конфигурацией Jenkinsfile:

  • WORKSPACE

Разное

Я не уверен в этом. Они определенно из Дженкинса, но я не знаю, каков их жизненный цикл.

  • HUDSON_SERVER_COOKIE
  • JENKINS_SERVER_COOKIE
  • HUDSON_COOKIE

Заключительные замечания

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

0 голосов
/ 03 июля 2018

Несколько способов добиться этого:

  1. Вы можете заставить ваше приложение принимать аргументы и затем передавать Значение ИСТИНА / ЛОЖЬ, указывающее, что он работает от Дженкинса или нет.

  2. Вы также можете прочитать системные свойства ОС

например. System.getProperty ( "os.arch");

Но это не сработает, если ваша среда Дженкинса и ваша рабочее пространство на одной машине

  1. Вы можете просто установить переменную env в своем конвейере (существует только в конвейере), а в приложении вы можете прочитать это значение

Вот так:

Трубопровод - опция1

     pipeline {
            environment {
                FROM_JENKINS= "TRUE" 
            } stage('test'){ 

                   sh "mvn test"
             }
        }

Трубопровод - опция2

     pipeline {
            stage('test'){ 

                    sh '''FROM_JENKINS="TRUE" // setting the env variable in the same shell where you are running mvn
                        mvn test'''
             }
        }

Применение

boolean isJenkinsBuild = Boolean.valueOf(System.getenv("FROM_JENKINS"));
boolean isSoftwarePresent = new ProcessBuilder("check software presence").start().waitFor() == 0;
Assume.assumeTrue("Software not present", isSoftwarePresent || isJenkinsBuild);

Надеюсь, это поможет:)

...