Я запускаю конвейерную работу Jenkins с Groovy.Groovy вызывает bash-скрипты для каждого шага.
Я хочу провалить всю работу, когда что-то в пути содержит ошибки.
Для Groovy я использую returnStatus: true
.
* 1007.* Для Bash я использую
set -e
.
Но bash-скрипт с set -e
не завершается, если, например, оператор while
имеет ошибки.Это то, что на самом деле должно произойти, согласно странице руководства Linux для 'set'.Я хотел бы знать, как немедленно выйти из этого сценария.
Сценарий:
[jenkins-user@jenkins ~]$ cat script.sh
#!/bin/bash
set -xe
FILE=commands.txt
echo "echos before while"
# Run the commands in the commands file
while read COMMAND
do
$COMMAND
done < $FILE
echo $?
echo "echos after faulty while"
Допустим, «command.txt» не существует.Выполнение сценария:
[jenkins-user@jenkins ~]$ sh script.sh
echos before while
script.sh: line 13: commands.txt: No such file or directory
1
echos after faulty while
[jenkins-user@jenkins ~]$ echo $?
0
Хотя оператор while
возвращает код завершения 1, сценарий продолжается и успешно завершается, как было отмечено сразу, с помощью echo $?
.
Вот как явынудить Groovy завершиться с ошибкой, после выполнения шага с помощью команды / сценария bash / python / etc возвращается ненулевой код завершения:
pipeline {
agent any
stages {
stage("A") {
steps {
script {
def rc = sh(script: "sh A.sh", returnStatus: true)
if (rc != 0) {
error "Failed, exiting now..."
}
}
}
}
}
}
Первый вопрос, как сделать сбой сценария SHELL, когда время/ если в / etc есть ошибки?Я знаю, что могу использовать command || exit 1
, но это не выглядит элегантно, если в сценарии есть десятки таких утверждений.
Второй вопрос: правильна ли обработка ошибок в Groovy?Кто-нибудь может предложить событие лучше?Или, может быть, есть плагин Jenkins / официальный способ сделать это?