В проекте, над которым я работаю, мы используем сценарии оболочки для выполнения различных задач. Некоторые скрипты – 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 отмечать сборку как неустойчивую, а не только успех / неудачу при запуске сценариев оболочки?
Используйте плагин 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
Настройте сборку 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;
Добавить post-build action Опубликовать отчет о результатах теста JUnit для XML-отчетов отчета об испытаниях. Этот плагин изменит Stable build на Unstable, если тест не будет выполнен.
**/build/junit.xml
Добавьте плагин 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
Кажется, это работает неплохо.
Я наткнулся на решение здесь
Вы можете просто вызвать «exit 1», и сборка завершится неудачно и не будет продолжена. Я закончил делать сквозную функцию, чтобы выполнить ее для меня, и назовите safemake вместо того, чтобы делать для строительства:
function safemake { make "$@" if [ "$?" -ne 0 ]; then echo "ERROR: BUILD FAILED" exit 1 else echo "BUILD SUCCEEDED" fi }