Чтение переменной окружения, установленной тестом в конвейере Jenkins - PullRequest
0 голосов
/ 13 февраля 2020

Не найдено ни одной ссылки на этот конкретный вопрос.

Я ищу способ добиться чего-то подобного в конвейере Jenkins, который запускает наши приемочные тесты с использованием Protractor и Cucumber. js:

            steps {
                container('selenium') {
                    script {
                        try {
                             {
                                //run tests
                            }
                        }
                        catch (err) {
                            if (env.testFailed == 'true') {
                                println "A test failure exists - build status updated to failure"
                                currentBuild.result = 'FAILURE'
                                error "Test(s) have failed"
                            } 
                            else {
                                println "No test failures exist - build status updated to success"
                                currentBuild.result = 'SUCCESS'
                            }
                        }
                    }
                }
            }

Это может привести к сбою сборки если env var testFailed равен 'true'. Причина этого заключается в том, что мы сталкиваемся с ошибками в платформе Protractor-Cucumber, в которой, если неудачный тест повторяется и проходит, код выхода этапа все еще равен 1.

Таким образом, в ловушке После каждого теста я устанавливаю env var использует node.js в значение true, если состояние сценария не удалось:

  if (scenario.result.status === Status.FAILED) {
    process.env.testFailed = 'true';
  }
  if (scenario.result.status === Status.PASSED) {
    process.env.testFailed = 'false';
  }

Проблема, которую я обнаружил, заключается в том, что конвейеру Jenkins не удается прочитать значение env var в блоке кода раздела catch. Это всегда ноль.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

1) измените ловушку After, чтобы записать флаг true / false в файл в формате syn c.

2) прочитать файл в блоке catch

catch(err) {
   testFailed = sh(script:'cat result.flag.txt', returnStdout: true).trim()
   if(testFailed == 'true') {
      ...
   }

}

Другой вариант, если в выводе npm test

lines = []

try {
   lines = sh(script:'npm test', returnStdout: true).readLines();    
}
catch(err) {
   size = lines.size()

   // parse the last 20 lines to extract fail/pass/total number
   for(int i=size-20;i<size;i++) {
      line[i]
   } 
}
указан номер общего / пройденного / неудачного случая
1 голос
/ 14 февраля 2020

ПОЧЕМУ ЭТО НЕ РАБОТАЕТ СЕЙЧАС?

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

ЧТО ВЫ МОЖЕТЕ ПОПРОБОВАТЬ СДЕЛАТЬ

Это на самом деле зависит от того, как вы запустите тесты, но это должна быть опция

// run tests here

// you should have a variable for your container
def exit_code = sh(script: "sudo docker inspect ${container.id} --format='{{.State.ExitCode}}'", returnStdout: true)

sh "exit ${exit_code}"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...