I have pipeline which has dynamic parallel stages and I want my pipeline to fail fast, if any of the stage fail. I tried to add failFast: true but my pipeline is stuck at "Failed at Stage ABC".
stage("Deploy") {
steps {
script {
def stages = createStages("Name", "Project")
fastFail: true
for (stage in stages) {
parallel stage
}
}
}
}
Solution: Use failFast
flag on Jenkins pipeline.
From Documentation: You can force your parallel stages to all be aborted when one of them fails, by adding
failFast
true to the stage containing the parallel.
Pay attention that all jobs would be triggered and quit (if one fails) if the agent node was started in each one of them (if job 'a' in pipeline fails but job 'b' is still looking for node and not started yet, it will continue - [this is an edge case]).
Examples - The options are :
1.Use parallelsAlwaysFailFast method in your options pipeline:
pipeline {
agent any
options {
parallelsAlwaysFailFast()
}
stages {
stage('Non-Parallel Stage') {
steps {
echo 'This stage will be executed first.'
}
}
stage('Parallel Stage') {
when {
branch 'master'
}
parallel {
stage('Branch A') {
agent {
label "for-branch-a"
}
steps {
echo "On Branch A"
}
}
stage('Branch B') {
agent {
label "for-branch-b"
}
steps {
echo "On Branch B"
}
}
stage('Branch C') {
agent {
label "for-branch-c"
}
stages {
stage('Nested 1') {
steps {
echo "In stage Nested 1 within Branch C"
}
}
stage('Nested 2') {
steps {
echo "In stage Nested 2 within Branch C"
}
}
}
}
}
}
}
2.Use before parallel using failFast true
stage('Parallel Stage') {
when {
branch 'master'
}
failFast true
parallel {
3.Configure jobs in map and execute with failFast attribute on.
jobsList = [
{job: 'jobA', parameters: [booleanParam(name: 'flag', value: true)]},
{job: 'jobB', parameters: [booleanParam(name: 'flag', value: true)]}
]
jobsList.failFast = true
parallel(jobsList)