Как отметить нестабильную сборку в 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 настроен и тест завершается неудачно, то сборка будет отмечена как нестабильная.
Как я могу заставить Дженкинса отметить сборка как нестабильная, а не только успешная / неудачная при запуске сценариев оболочки?
14 ответов:
использовать Text-finder плагин.
вместо выхода со статусом 1 (что приведет к сбою сборки), выполните:
if ($build_error) print("TESTS FAILED!");
чем в действиях после сборки включить text Finder, установите регулярное выражение в соответствии с напечатанным сообщением (
TESTS FAILED!
) и установите флажок "нестабильно, если найдено" под этой записью.
Это можно сделать без печати магических строк и с помощью TextFinder. вот!--5--> информацию об этом.
в основном вам нужно .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
проблема в том, что Дженкинс-Кинк.jar должен быть доступен из сценария оболочки. Вы можете либо поместите его в легкий для доступа путь или загрузите через скрипт оболочки задания:
wget ${JENKINS_URL}jnlpJars/jenkins-cli.jar
вы также должны иметь возможность использовать groovy и делать то, что сделал textfinder
маркировка сборки как нестабильной с groovy post-build plugin
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() }
см. Также Groovy Postbuild Плагин
в моем сценарии задания у меня есть следующие операторы (это задание выполняется только на мастере Дженкинса):
# 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
вы можете увидеть это и многое другое о настройке статусов сборки на вики Дженкинса:https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI
вы должны использовать Jenkinsfile, чтобы обернуть сценарий сборки и просто отметить текущую сборку как нестабильную с помощью
currentBuild.result = "UNSTABLE"
.stage { status = /* your build command goes here */ if (status === "MARK-AS-UNSTABLE") { currentBuild.result = "UNSTABLE" } }
современные версии Jenkins (начиная с 2.26, октябрь 2016) решили это: это просто расширенный вариант для выполнения шага сборки оболочки!
вы можете просто выбрать и установить произвольное значение выхода; если они совпадают, то сборка будет нестабильной. Просто выберите значение, которое вряд ли будет запущено реальным процессом в вашей сборке.
настроить 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>
завершить построение скрипта со статусом 0
... exit 0;
добавить действие после сборки опубликовать отчет о результатах теста JUnit для отчета по испытанию XMLs. Этот плагин изменит стабильную сборку на нестабильную, когда тест не удается.
**/build/junit.xml
добавить Дженкинс Text Finder плагин с консольным выводом сканирования и непроверенные варианты. Этот плагин не может полностью построить на фатальной ошибке.
PHP Fatal error:
Я считаю, что самый гибкий способ сделать это-прочитать файл в плагине groovy post build.
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() }
если содержимое файла "true", сборка будет установлена в нестабильное состояние. Это будет работать на локальном ведущем устройстве и на любых ведомых устройствах, на которых вы запускаете задание, а также для любых сценариев, которые могут записывать на диск.
в качестве более легкой альтернативы существующим ответам вы можете установить результат сборки с помощью простого HTTP-запрос POST, чтобы получить доступ к консоли скрипт Groovy API-интерфейс REST:
curl -X POST \ --silent \ --user "$YOUR_CREDENTIALS" \ --data-urlencode "script=Jenkins.instance.getItemByFullName( '$JOB_NAME' ).getBuildByNumber( $BUILD_NUMBER ).setResult( hudson.model.Result.UNSTABLE )" $JENKINS_URL/scriptText
плюсы:
- нет необходимости загружать и запускать огромный файл jar
- нет kludges для установки и чтения некоторого глобального состояния (текст консоли, файлы в рабочей области)
- плагины не требуются (кроме Groovy)
- нет необходимости настраивать дополнительный шаг сборки то есть лишним в пропущенных или провальных случаях.
для этого решения ваша среда должна соответствовать следующим условиям:
- Jenkins REST API можно получить из slave
- Slave должен иметь доступ к учетным данным, которые позволяют получить доступ к Jenkins Groovy script REST API.
текстовый навигатор работает только в том случае, если состояние задания не было изменено с успешного на неудачное или прерванное. В таких случаях используйте сценарий 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/
дублирование моего ответа от здесь потому что я потратил некоторое время на поиски этого:
это теперь возможно в более новых версиях Дженкинса, вы можете сделать что-то вроде этого:
#!/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}") } } }
генератор синтаксиса конвейера показывает это на вкладке Дополнительно:
Я думал, что опубликую еще один ответ для людей, которые могут искать что-то подобное.
в нашей работе по сборке у нас есть случаи, когда мы хотели бы, чтобы сборка продолжалась, но была отмечена как нестабильная. Для наших это относится к номерам версий.
Итак, я хотел установить условие на сборку и установить сборку нестабильной, если это условие выполняется.
я использовал условный шаг (один) опция в качестве сборки шаг.
тогда я использовал выполнить системный Groovy script как шаг сборки, который будет выполняться при выполнении этого условия.
Я Команды В Groovy и установить скрипт
import hudson.model.* def build = Thread.currentThread().executable build.@result = hudson.model.Result.UNSTABLE return
Это, кажется, работает очень хорошо.
я наткнулся на решение здесь
если оболочка закончилась неудачной командой, что все ОК (сборка не удалась:) В случае неудачной команды внутри сценария оболочки выполните проверку после команды:
if [ "$?" -ne 0 ]; then exit 1 fi
исправление от @zrajm: это может быть упрощено до
... || exit 1
вы можете просто вызвать "выход 1", и сборка завершится неудачей в этот момент и не будет продолжаться. Я завелся, что делает функция сквозной сделать, чтобы справиться с этим для меня, и называть safemake вместо того, чтобы сделать здание:
function safemake { make "$@" if [ "$?" -ne 0 ]; then echo "ERROR: BUILD FAILED" exit 1 else echo "BUILD SUCCEEDED" fi }