I have a series of stages that perform quick checks. I want to perform them all, even if there are failures. For example:
stage('one') {
node {
sh 'exit 0'
}
}
stage('two') {
node {
sh 'exit 1' // failure
}
}
stage('three') {
node {
sh 'exit 0'
}
}
Stage two
fails, so by default stage three
is not executed.
Ordinarily this would be a job for parallel
, but I want to display them in the stage view. In the mock up below:
- Build #4 shows what normally happens. Job
two
fails sothree
does not run. - I Photoshopped Build #6 to show what I would like to see. Job
two
fails and is displayed as such, butthree
still runs. The real Jenkins would probably display the entire Build #6 tinged slightly red, which is of course fine.
This is now possible. Below is an example of a declarative pipeline, but catchError
works for scripted pipelines as well.
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'
}
}
}
}
In the example above, all stages will execute, the pipeline will be successful, but stage 2 will show as failed:
As you might have guessed, you can freely choose the buildResult
and stageResult
, in case you want it to be unstable or anything else. You can even fail the build and continue the execution of the pipeline.
Just make sure your Jenkins is up to date, since this is a fairly new feature.
EDIT: You need "Pipeline: Basic Steps" 2.16 (May 14, 2019)
I had the same concern, I was able to resolved it doing this.
Second stage will show in red and marked as failed meanwhile rest of the stages will keep running. You can set a flag and at the end of the stages checking that flag you can inform the status of the whole build.
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"
}
}
This should work. However all boxes are red if even only one fails, but you can see boxes with error marked, so you will easily distinguish failed jobs.
def indexes = ['one', 'two', 'three']
node() {
for (index in indexes) {
catchError {
stage(index) {
println index
sh '''echo "123"'''
}
}
}
}
Use
propagate: false
flag to move to next stage when previous stage fails.
example:
stage('<stage-name>'){
node('<node-name>'){
build job: '<job-name>', propagate: false
}
}
stage('<stage-name>'){
node('<node-name>'){
build job: '<job-name>'
}
}
It depends whether you are using declarative pipeline syntax or scripted pipeline syntax.
declarative pipeline syntax:
pipeline {
agent any
stages {
stage('one') {
steps {
sh 'exit 0'
}
}
stage('two') {
steps {
sh 'exit 1' // failure
}
}
}
post {
always {
sh 'exit 0'
}
}
}
Post-condition blocks contain steps the same as the steps section.
scripted pipeline syntax:
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"
}
}
I resolved that, using post actions: https://jenkins.io/doc/pipeline/tour/post/
post {
always {
...
}
}
来源:https://stackoverflow.com/questions/40600621/continue-jenkins-pipeline-past-failed-stage