от
Я работаю на конвейере Дженкинса с Groovy. Groovy вызывает bash-скрипты для каждого шага. Я хочу провалить всю работу, когда что-то мешает. Для Groovy я использую
returnStatus: true
. Для Bash я использую
set .

Но bash-скрипт с set  не завершается, если, например, в операторе while
есть ошибки. Это то, что на самом деле должно произойти, согласно странице руководства Linux для 'set'. Я хотел бы знать, как немедленно выйти из этого сценария. Сценарий:
[jenkins

Допустим, «command.txt» не существует.
Запуск скрипта:

[jenkins

Хотя оператор 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 не работать, если в операторах while / if / etc есть ошибки? Я знаю, что могу использовать
command || exit 1
, но это не кажется элегантным, если в сценарии есть десятки таких утверждений. Второй вопрос: правильно ли обрабатывать ошибки в Groovy? Кто-нибудь может предложить событие лучше? Или, может быть, есть плагин Jenkins / официальный способ сделать это?              

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

4 Ответы

0 голосов
от
Первый вопрос, эта ссылка может быть полезна Прерывание сценария оболочки, если какая-либо команда возвращает ненулевое значение Второй вопрос: вы можете улучшить обработку ошибок, используя 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 голосов
от
Почему бы вам просто не использовать код выхода
while
и вернуть его? (Смотрите эту модифицированную версию вашего скрипта, последние строки)
[jenkins
    
0 голосов
от
[jenkins

Когда вы выполните echo $?
после этого сценария, он всегда будет 0, потому что последней командой была
echo "echos after faulty while"
, вы можете добавить
exit 1
в конце вашего сценария. В
exit 1
число 1 будет кодом ошибки, вы можете использовать другое. Так что скрипт будет
[jenkins
    
0 голосов
от
О скрипте Bash. Ваша проблема заключается в том, что перенаправление сбоя не прерывает сценарий bash, несмотря на использование
set . Я был удивлен собой. Но это мое первое разочарование по поводу set , так что теперь я считаю, что не доверяю ему и злоупотребляю такими вещами, как $command || exit 1
... Здесь вы можете сделать следующее:
set 

Но весь цикл должен быть упрощен в:

bash $FILE
    
...