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

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

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

// :: End of PHP скрипт:
// If any tests have failed, fail the build
if ($build_error) exit(1);

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

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

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

Ответ 1

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

Вместо того, чтобы выйти из состояния 1 (что приведет к сбою сборки), выполните:

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

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

Ответ 2

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

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

Ответ 3

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

маркировка сборки как неустойчивая с 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()
}

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

Ответ 4

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

Ответ 5

  • Настройте сборку 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>
    
  • Завершить построение script со статусом 0

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

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

    PHP Fatal error:
    

Ответ 6

Я нахожу самый гибкий способ сделать это, читая файл в плагине post w 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", сборка будет установлена ​​на нестабильную. Это будет работать на локальном хозяине и на любых подчиненных устройствах, на которых выполняется это задание, и на любых сценариях, которые могут записываться на диск.

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

   stage {
      status = /* your build command goes here */
      if (status === "MARK-AS-UNSTABLE") {
        currentBuild.result = "UNSTABLE"
      }
   }

Ответ 10

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

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

#!/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 показывает это на расширенной вкладке:

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

Ответ 11

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

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

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

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

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

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

import hudson.model.*

def build = Thread.currentThread().executable
[email protected] = hudson.model.Result.UNSTABLE

return

Это, кажется, работает достаточно хорошо.

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

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

Ответ 12

Вы можете просто вызвать "exit 1", и сборка завершится с ошибкой и не продолжит. Я закончил создание сквозной функции, чтобы выполнить ее для меня, и назовите safemake вместо make for building:

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