Продолжить трубопровод Дженкинса после неудачной стадии
У меня есть ряд этапов, которые выполняют быстрые проверки. Я хочу выполнить их все, даже если есть сбои. Например:
stage('one') {
node {
sh 'exit 0'
}
}
stage('two') {
node {
sh 'exit 1' // failure
}
}
stage('three') {
node {
sh 'exit 0'
}
}
Этап two
выходит из строя, поэтому на этапе по умолчанию three
не выполняются.
Обычно это была бы parallel
, но я хочу отобразить их в виде сцены. В макете ниже:
- Сборка № 4 показывает, что обычно происходит. Работа
two
не удается, так что three
не работает. - Я сделал фотошоп Build # 6, чтобы показать то, что я хотел бы увидеть. Задание
two
не выполняется и отображается как таковое, но three
все еще выполняется. Настоящий Дженкинс, вероятно, будет отображать весь Build # 6 с оттенком красного цвета, что, конечно, хорошо.
![Mock up of desired Stage View result]()
Ответы
Ответ 1
Теперь это возможно. Ниже приведен пример декларативного конвейера, но catchError
работает и для скриптовых конвейеров.
pipeline {
agent any
stages {
stage('1') {
steps {
sh 'exit 0'
}
}
stage('2') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh "exit 1"
}
}
}
stage('3') {
steps {
sh 'exit 0'
}
}
}
}
В приведенном выше примере все этапы будут выполнены, конвейер будет успешным, но этап 2 будет отображаться как сбойный:
![Pipeline Example]()
Как вы уже догадались, вы можете свободно выбирать buildResult
и stageResult
, если хотите, чтобы они были нестабильными или что-то еще. Вы даже можете не выполнить сборку и продолжить выполнение конвейера.
Просто убедитесь, что ваш Jenkins обновлен, поскольку это довольно новая функция.
ОБНОВЛЕНИЕ: Вам нужен "Трубопровод: основные шаги" 2.16 (14 мая 2019 г.)
Ответ 2
У меня была такая же проблема, я смог решить это, сделав это.
Второй этап будет выделен красным цветом и помечен как неудачный, в то время как остальные этапы продолжат работать. Вы можете установить флаг, и в конце этапов проверки этого флага вы можете сообщить статус всей сборки.
node {
def build_ok = true
stage('one') {
sh 'exit 0'
}
try{
stage('two') {
sh 'exit 1' // failure
}
} catch(e) {
build_ok = false
echo e.toString()
}
stage('three') {
sh 'exit 0'
}
....
if(build_ok) {
currentBuild.result = "SUCCESS"
} else {
currentBuild.result = "FAILURE"
}
}
Ответ 3
Это должно сработать. Однако все поля красны, если даже один из них не работает, но вы можете видеть поля с помеченной ошибкой, поэтому вы легко сможете отличить неудавшиеся задания.
def indexes = ['one', 'two', 'three']
node() {
for (index in indexes) {
catchError {
stage(index) {
println index
sh '''echo "123"'''
}
}
}
}
Ответ 4
использование
распространять: ложь
флаг, чтобы перейти к следующему этапу, когда предыдущий этап не удается
пример:
stage('<stage-name>'){
node('<node-name>'){
build job: '<job-name>', propagate: false
}
}
stage('<stage-name>'){
node('<node-name>'){
build job: '<job-name>'
}
}
Ответ 5
Это зависит от того, используете ли вы декларативный конвейерный синтаксис или скриптовый конвейерный синтаксис.
Синтаксис декларативного конвейера:
pipeline {
agent any
stages {
stage('one') {
steps {
sh 'exit 0'
}
}
stage('two') {
steps {
sh 'exit 1' // failure
}
}
}
post {
always {
sh 'exit 0'
}
}
}
Блоки постусловия содержат шаги, аналогичные разделу шагов.
Синтаксис скриптового конвейера:
node {
def build_ok = true
stage('one') {
sh 'exit 0'
}
try{
stage('two') {
sh 'exit 1' // failure
}
} catch(e) {
build_ok = false
echo e.toString()
}
stage('three') {
sh 'exit 0'
}
if(build_ok) {
currentBuild.result = "SUCCESS"
} else {
currentBuild.result = "FAILURE"
}
}
Ответ 6
Я решил это, используя действия с сообщением: https://jenkins.io/doc/pipeline/tour/post/
post {
always {
...
}
}