Как пометить нестабильную сборку в Jenkins при запуске сценариев оболочки - PullRequest
73 голосов
/ 16 ноября 2011

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

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

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

В терминологии Jenkins нестабильная сборка определяется как

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

Как заставить Дженкинса пометить сборку как нестабильную, а не только успешную / неудачную при запуске сценариев оболочки?

Ответы [ 14 ]

55 голосов
/ 11 января 2012

Это можно сделать, не печатая волшебные строки и не используя 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
53 голосов
/ 16 ноября 2011

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

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

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

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

38 голосов
/ 05 апреля 2018

Современные версии Jenkins (с 2.26, октябрь 2016 г.) решили эту проблему: это просто расширенный вариант для шага сборки оболочки Execute!

exit code for build

Youможно просто выбрать и установить произвольное значение выхода;если он совпадает, сборка будет нестабильной.Просто выберите значение, которое вряд ли будет запущено реальным процессом в вашей сборке.

14 голосов
/ 10 мая 2017

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

   stage {
      status = /* your build command goes here */
      if (status === "MARK-AS-UNSTABLE") {
        currentBuild.result = "UNSTABLE"
      }
   }
8 голосов
/ 17 августа 2012

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

пометка сборки как нестабильной с помощью отличного плагина пост-сборки

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 Plugin

6 голосов
/ 20 ноября 2012

В моем скрипте работы у меня есть следующие операторы (эта работа выполняется только на мастере 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

4 голосов
/ 18 февраля 2014
  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. Добавить действие после сборки Опубликовать отчет о результатах теста JUnit для XML отчета о тестировании.Этот плагин изменит стабильную сборку на нестабильную, если тест не пройден.

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

    PHP Fatal error:
    
3 голосов
/ 02 февраля 2016

Я считаю, что самый гибкий способ сделать это - прочитать файл в плагине groovy post build.enter image description here

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', сборка будет установлена ​​в нестабильное состояние.Это будет работать на локальном ведущем устройстве и на всех ведомых устройствах, на которых вы выполняете задание, и на любых сценариях, которые могут записывать на диск.

1 голос
/ 27 апреля 2018

В качестве более легкой альтернативы существующим ответам вы можете установить результат сборки с помощью простого HTTP POST для доступа к консоли REST API сценария Groovy :

    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-файл
  • без ключей для установки и чтения какого-либо глобального состояния (текст консоли, файлы в рабочей области)
  • плагинов не требуется(кроме Groovy)
  • нет необходимости настраивать дополнительный шаг сборки, который является излишним в случаях PASSED или FAILURE.

Для этого решения ваша среда должна удовлетворять следующим условиям:

  • Доступ к REST API Jenkins возможен из подчиненного устройства
  • У ведомого должен быть доступ к учетным данным, позволяющим получить доступ к API REST сценария Jenkins Groovy.
1 голос
/ 05 декабря 2017

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

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

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

Я использовал Условноеопция step (single) в качестве шага сборки.

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

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

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

...