Ошибка / Нестабильность через код возврата скрипта

Я хотел бы получить результат моей работы по сборке jenkins: неудачный (красный), нестабильный (желтый) или успешный (зеленый)...

Если я верну ненулевое значение из моего сценария оболочки, я могу только потерпеть неудачу. Есть ли код возврата, который производит нестабильно?

5 ответов

Обновление: более новые версии Jenkins поддерживают коды выхода, которые устанавливают unstable, Для получения дополнительной информации, пожалуйста, обратитесь сюда (спасибо @Pedro и @gib)

Я не проверял это.

Оригинальный ответ ниже:

Нет. Код завершения скрипта не выдаст UNSTABLE построить результат в Дженкинс.

Единственный способ установить UNSTABLE Результат сборки программно через Jenkins.

Это то, что делает тестовая часть Дженкинса.

Вы также можете использовать интерфейс командной строки Jenkins непосредственно из своего сценария, чтобы установить результат выполняемой в данный момент сборки. Вместо того, чтобы возвращать определенный код завершения, ваш скрипт должен выполнить команду CLI Jenkins. Для получения подробной информации, на вашем собственном сервере, перейдите http://<your-server>/cli/command/set-build-result

Есть также несколько плагинов, которые могут сделать то же самое, в том числе:

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

Генератор синтаксиса конвейера показывает это на вкладке "Дополнительно":

Пример синтаксиса конвейера

Как указано в одном из комментариев, это и есть проблема, о которой сообщила команда jenkins, уже исправленная и изначально запланированная для версии 2.26. Подробности смотрите в следующем выпуске. Разрешите заданиям "Выполнение оболочки" возвращать 2 для "нестабильных"

Но, похоже, это зависит от другой проблемы, которая все еще блокирует ее

Простой способ в конвейере:

try {
    sh "<Whatever your command mayeth be>"
} catch (Exception e) {
    // Caught a non-zero exit code
    // Mark build as unstable.
    currentBuild.result='UNSTABLE'
}

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

Он основан на "CLI", который предоставляет Jenkins. CLI реализован в виде отдельного JAR-файла, который можно загрузить с самого Jenkins. В следующем примере мы загружаем этот JAR-файл (если он еще не загружен) и вызываем его с помощью команды "set-build-result" и аргумента "unstable".

Затем ваш скрипт должен завершить работу с нулевым статусом, иначе сборка будет НЕ УКАЗАНА.

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

unstable() {
  test -f jenkins-cli.jar || wget -q ${JENKINS_URL}/jnlpJars/jenkins-cli.jar
  java -jar jenkins-cli.jar set-build-result unstable
}

do-something-that-might-go-badly || unstable
exit 0
Any Build Step Plugin
Fail The Build Plugin

first build step: Execute command
  Command: echo build_step
second build step: conditional step
  Run: Not
    !:Execute command
      Command: echo test_step
  Builder: Set the build result
    Result: Unstable

change "echo test_step" to "echo_test_step" to see how it works

if BUILD fails the result is FAILED, and TEST is not runned
if BUILD succedes, TEST runs, and if fails the result is UNSTABLE
if BUILD succedes, and TEST succedes, the result is SUCCESS
Другие вопросы по тегам