Ошибка / Нестабильность через код возврата скрипта
Я хотел бы получить результат моей работы по сборке jenkins: неудачный (красный), нестабильный (желтый) или успешный (зеленый)...
Если я верну ненулевое значение из моего сценария оболочки, я могу только потерпеть неудачу. Есть ли код возврата, который производит нестабильно?
5 ответов
Обновление: более новые версии Jenkins поддерживают коды выхода, которые устанавливают unstable
, Для получения дополнительной информации, пожалуйста, обратитесь сюда (спасибо @Pedro и @gib)
Я не проверял это.
Оригинальный ответ ниже:
Нет. Код завершения скрипта не выдаст UNSTABLE
построить результат в Дженкинс.
Единственный способ установить UNSTABLE
Результат сборки программно через Jenkins.
Это то, что делает тестовая часть Дженкинса.
Вы также можете использовать интерфейс командной строки Jenkins непосредственно из своего сценария, чтобы установить результат выполняемой в данный момент сборки. Вместо того, чтобы возвращать определенный код завершения, ваш скрипт должен выполнить команду CLI Jenkins. Для получения подробной информации, на вашем собственном сервере, перейдите http://<your-server>/cli/command/set-build-result
Есть также несколько плагинов, которые могут сделать то же самое, в том числе:
- Плагин для поиска текста.
- Отключите плагин сборки (он может установить любой статус), но вам нужно будет использовать его вместе с плагином Conditional Build Step.
- Groovy плагин (нужно будет выяснить полный код Groovy).
- Groovy плагин пост-сборки (поставляется с простым методом для установки результата сборки).
Теперь это возможно в новых версиях 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