Вот мой код, он использует плагин 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 при ошибке и НЕ останавливать выполнение оставшихся демонстраций? Я не хочу разбивать каждую демонстрацию на разные этапы.
В декларативных конвейерах этого можно добиться с помощью блока 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")
}
}
}