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

1 голос
/ 07 ноября 2017

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

Теперь это возможно в новых версиях 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 Syntax Example

1 голос
/ 03 марта 2016

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/

0 голосов
/ 29 ноября 2013

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

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

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

... || exit 1
0 голосов
/ 08 ноября 2012

Вы можете просто вызвать «выход 1», и в этот момент сборка не удастся и не будет продолжена.Я закончил делать сквозную функцию make, чтобы обработать ее для меня, и вызвал safemake вместо make для build:

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