Как завершить работу скрипта bash, когда / if / etc содержит ошибки? - PullRequest
2 голосов
/ 04 июля 2019

Я запускаю конвейерную работу 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 / официальный способ сделать это?

Ответы [ 4 ]

1 голос
/ 04 июля 2019

Первый вопрос, эта ссылка может быть полезна Прерывание сценария оболочки, если какая-либо команда возвращает ненулевое значение

Второй вопрос: вы можете улучшить обработку ошибок, используя try и catch для обработки исключений.

 try{
       def rc = sh(script: "sh A.sh", returnStatus: true)
       if (rc != 0)  {
                error "Failed, exiting now..."
       }
    }  
    catch (Exception er){
         errorMessage = er.getMessage();
    }
0 голосов
/ 04 июля 2019

О скрипте Bash.

Ваша проблема в том, что перенаправление ошибок не прерывает скрипт bash, несмотря на использование set -e.Я был удивлен собой.Но это мое первое разочарование по поводу set -e, так что теперь я решил не доверять ему и злоупотребляю такими вещами, как $command || exit 1 ...

Здесь вы можете сделать следующее:

set -xe -o pipefail
cat $FILE | while read command; do $command ; done

Но весь цикл следует упростить до:

bash $FILE
0 голосов
/ 04 июля 2019
[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"

Когда вы выполните echo $? после этого скрипта, оно всегда будет 0, потому что последней командой была echo "echos after faulty while", вы можете объявить exit 1 в конце вашего скрипта. В exit 1 число 1 будет кодом ошибки, вы можете использовать другое. Так что скрипт будет

[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 $?
exit 1
0 голосов
/ 04 июля 2019

Почему бы вам просто не использовать код выхода while и вернуть его?(Смотрите эту модифицированную версию вашего скрипта, последние строки)

[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
status=$?

echo "echos after faulty while"

exit $status
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...