Как отметить нестабильную сборку в 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

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) решили это: это просто расширенный вариант для шага сборки Execute shell!

exit code for build

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


  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 для отчета по испытанию XMLs. Этот плагин изменит стабильную сборку на нестабильную при сбое теста.

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

    PHP Fatal error:
    

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


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

    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 должен иметь доступ к учетным данным,который позволяет получить доступ к API REST скрипта Дженкинса Groovy.

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/


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

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

#!/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 Syntax Example


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

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

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

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

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

Я Команды В 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


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

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

исправление от @zrajm: его можно упростить до

... || exit 1

вы можете просто вызвать "выход 1", и сборка завершится с ошибкой в этот момент и не продолжится. Я закончил тем, что сделал функцию passsthrough make, чтобы справиться с ней для меня, и вызвать safemake вместо того, чтобы делать для здания:

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