Конвейер Jenkins получает текущее состояние после использования catchError - PullRequest
1 голос
/ 06 ноября 2019

Это продолжение моего предыдущего вопроса:

Установить статус этапа в Jenkins Pipelines

Оказывается, я могу сохранить конвейер как УСПЕХ, номожно пометить отдельный этап как НЕУСТОЙЧИВЫЙ, если я хочу через catchError, например:

node()
{
    stage("Stage 1")
    {
        catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE')
        {
            sh 'exit 1'
        }
    }
}

Если я хочу получить текущий статус самого конвейера, я могу использовать currentBuild.getCurrentResult(), но я несм. currentStage аналог этого.

Мне интересно попробовать шаблон, который на моих этапах может выглядеть примерно так:

stage("1") {
    catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {
        // do stuff
    }
    // perhaps more catchError() blocks
    if(currentStage.getCurrentResult() == "UNSTABLE") {
        // do something special if we're unstable
    }
}

, но он потерпит неудачу, поскольку currentStage недоступно.

В общем, catchError() это хорошо, но я хотел бы знать, как я могу поймать изменение статуса на моей стадии, если она меняется ... Кто-нибудь знает, как вы получаете доступ к статусу текущей стадии, в которой вы находитесь? из трубопровода?

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Хотя на данный момент не существует прямого метода для доступа к результату этапа в конвейере, вы можете обойти его. Это связано с тем, что вас интересуют только результаты этапа SUCCESS или UNSTABLE в соответствии с вопросом, а не FAILURE.

Обходной путь - инициализировать пустую карту в верхней части конвейера, чтобысохранить результат каждого этапа. Теперь вместо метода catchError() используйте метод unstable() в сочетании с блоком try-catch. Это связано с тем, что последнее позволяет не только установить результат как нестабильный, но и выполнять другие операции, такие как добавление результата на карту в блоке исключений. Затем вы можете прочитать этот сохраненный результат с карты в вашем операторе if.

Пример

stageResults = [:]
...
stage("1") {
    try {
        // do stuff
        // Add to map as SUCCESS on successful execution 
        stageResults."{STAGE_NAME}" = "SUCCESS"
    } catch (Exception e) {
        // Set the result and add to map as UNSTABLE on failure
        unstable("[ERROR]: ${STAGE_NAME} failed!")
        currentBuild.result = "SUCCESS"
        stageResult."{STAGE_NAME}" = "UNSTABLE"
    }
    if(stageResults.find{ it.key == "{STAGE_NAME}" }?.value == "UNSTABLE") {
        // do something special if we're unstable
    }
}
0 голосов
/ 07 ноября 2019

В качестве альтернативы добавлению ответа Дибакара Адитьи можно обернуть все в функцию, которая напоминает обычные шаги. Т.е.:

stage("1") {
    def localSuccess = catchLocalError {
        // do stuff
    }
    if(!localSuccess) {
        // do something special if we're unstable
    }
}

boolean catchLocalError(Closure c) {
    try {
        c()
        return true
    } catch (Exception e) {
        return false
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...