Как я могу пометить этап как FAILED, но продолжить его выполнение в Jenkins?

Вот мой код, он использует плагин jenkins:

pipeline
{
    agent any
    stages
    {
        stage ('Run Demos')
        {
            def demoPath = '"' + env.WORKSPACE + 'MyDemo.exe"'
            def demoNames = ["demo1", "demo2"]
            for (demoName in demoNames)
            {
                bat('start /b /wait "" ' + demoPath + ' ' + demoName)
            }
        }
    }
}

Когда bat('start /b /wait "" ' + demoPath + ' ' + demoName) терпит неудачу внутри цикла, весь этап останавливается. Я могу обойти это, добавив блок try-catch или catchError вокруг вызова bat, но тогда шаг помечен как УСПЕХ (зеленый), даже если код возврата помечен как FAILURE (красный).

Есть ли способ пометить этап как FAILURE при ошибке и НЕ останавливать выполнение оставшихся демонстраций? Я не хочу разбивать каждую демонстрацию на разные этапы.


1
64
2

Ответы:

Решено

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

stage ('Run Demos')
{
    steps 
    {
        def demoPath = '"' + env.WORKSPACE + 'MyDemo.exe"'
        def demoNames = ["demo1", "demo2"]
        for (demoName in demoNames)
        {
            catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') 
            {
                bat('start /b /wait "" ' + demoPath + ' ' + demoName)
            }
        }
    }
}

Общая сборка, а также этап будут помечены как FAILURE в случае исключения, но остальные демонстрации и следующий этап будут выполняться в любом случае.

Используйте SUCCESS или null, чтобы buildResult не устанавливался при обнаружении ошибки.

Смотрите также:


Другой вариант — использовать currentBuild.result для установки статуса в блоке catch.

script {
    for (demoName in demoNames) {
        try {
            bat('start /b /wait "" ' + demoPath + ' ' + demoName)
        } catch (e) {
            currentBuild.result = 'FAILURE'
            unstable("One of the demos failed")
        }
    }
}