Как отметить неустойчивость сборки в Jenkins при запуске сценариев оболочки

В проекте, над которым я работаю, мы используем сценарии оболочки для выполнения различных задач. Некоторые скрипты – SH / Bash, которые запускают Rsync, а некоторые – скрипты PHP. Один из скриптов PHP запускает некоторые интеграционные тесты, которые выводятся в JUnit XML, отчеты о покрытии кода и тому подобное.

Дженкинс может отмечать задания как успешные / неудачные результаты выхода . В PHP сценарий завершается с 1, если он обнаружил, что неудачные тесты во время прогона. Другие сценарии оболочки запускают команды и используют коды выхода из них, чтобы пометить сборку как неудачную.

// :: End of PHP script: // If any tests have failed, fail the build if ($build_error) exit(1); 

В терминологии Дженкинса неустойчивая сборка определяется как

Сборка нестабильна, если она была успешно построена, и один или несколько издателей сообщают об ее неустойчивости. Например, если издатель JUnit настроен и тест завершился неудачей, сборка будет отмечена как неустойчивая.

Как я могу заставить Jenkins отмечать сборку как неустойчивую, а не только успех / неудачу при запуске сценариев оболочки?

Solutions Collecting From Web of "Как отметить неустойчивость сборки в Jenkins при запуске сценариев оболочки"

Используйте плагин Text-finder .

Вместо того чтобы выйти со статусом 1 (который не сработает), выполните:

 if ($build_error) print("TESTS FAILED!"); 

Чем в действиях после сборки можно включить Text Finder, установите регулярное выражение в соответствие с напечатанным вами сообщением ( TESTS FAILED! ) И установите флажок «Нестабильно, если обнаружено» в этой записи.

Это можно сделать без печати магических строк и с помощью TextFinder. Вот некоторая информация об этом.

В основном вам нужен файл .jar из http: // yourserver.com / cli, доступный в сценариях оболочки, тогда вы можете использовать следующую команду, чтобы отметить нестабильную сборку:

 java -jar jenkins-cli.jar set-build-result unstable 

Чтобы отметить неустойчивость сборки при ошибке, вы можете использовать:

 failing_cmd cmd_args || java -jar jenkins-cli.jar set-build-result unstable 

Проблема в том, что jenkins-cli.jar должен быть доступен из сценария оболочки. Вы можете либо поместить его в простой путь доступа, либо загрузить через скрипт оболочки задания:

 wget ${JENKINS_URL}jnlpJars/jenkins-cli.jar 

вы также должны иметь возможность использовать groovy и делать то, что сделал текстовый редактор

маркировка сборки как неустойчивая с мощным плагином после сборки

 if(manager.logContains("Could not login to FTP server")) { manager.addWarningBadge("FTP Login Failure") manager.createSummary("warning.gif").appendText("<h1>Failed to login to remote FTP Server!</h1>", false, false, false, "red") manager.buildUnstable() } 

Также см. Плагин Postovild Groovy

В моем сценарии работы у меня есть следующие утверждения (эта работа выполняется только для мастера Jenkins):

 # This is the condition test I use to set the build status as UNSTABLE if [ ${PERCENTAGE} -gt 80 -a ${PERCENTAGE} -lt 90 ]; then echo WARNING: disc usage percentage above 80% # Download the Jenkins CLI JAR: curl -o jenkins-cli.jar ${JENKINS_URL}/jnlpJars/jenkins-cli.jar # Set build status to unstable java -jar jenkins-cli.jar -s ${JENKINS_URL}/ set-build-result unstable fi 

Вы можете увидеть это и получить дополнительную информацию о настройке статусов сборки на вики Jenkins: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  1. Настройте сборку PHP для создания отчета xml junit

     <phpunit bootstrap="tests/bootstrap.php" colors="true" > <logging> <log type="junit" target="build/junit.xml" logIncompleteSkipped="false" title="Test Results"/> </logging> .... </phpunit> 
  2. Завершить скрипт сборки со статусом 0

     ... exit 0; 
  3. Добавить post-build action Опубликовать отчет о результатах теста JUnit для XML-отчетов отчета об испытаниях. Этот плагин изменит Stable build на Unstable, если тест не будет выполнен.

     **/build/junit.xml 
  4. Добавьте плагин Text Finder Jenkins с консольным выходом и непроверенными опциями. Этот плагин полностью не работает с фатальной ошибкой.

     PHP Fatal error: 

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

 import hudson.FilePath import java.io.InputStream def build = Thread.currentThread().executable String unstable = null if(build.workspace.isRemote()) { channel = build.workspace.channel; fp = new FilePath(channel, build.workspace.toString() + "/build.properties") InputStream is = fp.read() unstable = is.text.trim() } else { fp = new FilePath(new File(build.workspace.toString() + "/build.properties")) InputStream is = fp.read() unstable = is.text.trim() } manager.listener.logger.println("Build status file: " + unstable) if (unstable.equalsIgnoreCase('true')) { manager.listener.logger.println('setting build to unstable') manager.buildUnstable() } 

Если содержимое файла «истинно», сборка будет установлена ​​на нестабильную. Это будет работать на локальном хозяине и на любых подчиненных устройствах, на которых выполняется ваше задание, и на любых сценариях, которые могут записываться на диск.

Если оболочка закончилась неудачной командой, все ОК (сборка не выполнена 🙂 В случае неудачной команды внутри сценария оболочки выполните проверку после команды:

  if [ "$?" -ne 0 ]; then exit 1 fi 

TextFinder хорош только в том случае, если статус задания не был изменен с SUCCESS на FAILED или ABORTED. Для таких случаев используйте сценарий groovy на шаге PostBuild:

 errpattern = ~/TEXT-TO-LOOK-FOR-IN-JENKINS-BUILD-OUTPUT.*/; manager.build.logFile.eachLine{ line -> errmatcher=errpattern.matcher(line) if (errmatcher.find()) { manager.build.@result = hudson.model.Result.NEW-STATUS-TO-SET } } 

Подробнее см. В сообщении, которое я написал об этом: http://www.tikalk.com/devops/JenkinsJobStatusChange/

Вы должны использовать Jenkinsfile, чтобы обернуть скрипт сборки и просто пометить текущую сборку как UNSTABLE, используя currentBuild.result = "UNSTABLE" .

    сцена {
       status = / * Ваша команда сборки идет здесь * /
       if (status === "MARK-AS-UNSTABLE") {
         currentBuild.result = "UNSTABLE"
       }
    }

Дублирование моего ответа отсюда, потому что я потратил некоторое время на это:

Теперь это возможно в более новых версиях Дженкинса, вы можете сделать что-то вроде этого:

 #!/usr/bin/env groovy properties([ parameters([string(name: 'foo', defaultValue: 'bar', description: 'Fails job if not bar (unstable if bar)')]), ]) stage('Stage 1') { node('parent'){ def ret = sh( returnStatus: true, // This is the key bit! script: '''if [ "$foo" = bar ]; then exit 2; else exit 1; fi''' ) // ret can be any number/range, does not have to be 2. if (ret == 2) { currentBuild.result = 'UNSTABLE' } else if (ret != 0) { currentBuild.result = 'FAILURE' // If you do not manually error the status will be set to "failed", but the // pipeline will still run the next stage. error("Stage 1 failed with exit code ${ret}") } } } 

Генератор синтаксиса Pipeline показывает это на расширенной вкладке:

Пример синтаксиса трубопровода

Я думал, что отправлю еще один ответ людям, которые могли бы найти что-то подобное.

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

Итак, я хотел установить условие для сборки и установить, что сборка нестабильна, если это условие выполнено.

В качестве шага сборки я использовал опцию « Условный шаг (одиночный)» .

Затем я использовал скрипт Groovy системы Execute как шаг сборки, который будет выполняться при выполнении этого условия.

Я использовал команду Groovy и установил скрипт следующим образом:

 import hudson.model.* def build = Thread.currentThread().executable build.@result = hudson.model.Result.UNSTABLE return 

Кажется, это работает неплохо.

Я наткнулся на решение здесь

http://tech.akom.net/archives/112-Marking-Jenkins-build-UNSTABLE-from-environment-inject-groovy-script.html

Вы можете просто вызвать «exit 1», и сборка завершится неудачно и не будет продолжена. Я закончил делать сквозную функцию, чтобы выполнить ее для меня, и назовите safemake вместо того, чтобы делать для строительства:

 function safemake { make "$@" if [ "$?" -ne 0 ]; then echo "ERROR: BUILD FAILED" exit 1 else echo "BUILD SUCCEEDED" fi }