7

I have a Jenkins declarative pipeline with several stages. Some of these stages need to be executed based on whether a previous stage has been executed. In pseudocode:

pipeline{ stages{ stage('1: Always do this thing') { steps { sh 'do_thing.sh' } } stage('2: Maybe do this thing') { when{ condition } steps { sh 'sometimes_do_this_thing.sh' } } stage('3: Do this thing if 2 was executed'){ when { pipeline.stages.2.was_executed } steps { sh 'conditional_path.sh' } } } } 

I accept that the best way to do this might be in the scripted pipeline, but I have declarative pipelines. Including some scripted bits in them is also acceptable, if kept to a minimum.

So: What is the most elegant way to execute a stage in a pipeline conditional on the execution status of the previous one?

2
  • Could you explain what is going wrong? What I see on a daily basis is that if one uses stage that they are executed sequentially and the next stage will be started if the former has been completed, unless if parallel is enabled. Commented Nov 15, 2019 at 9:27
  • The issue is only that I can't predict whether the condition will be satisfied in Stage 2. I don't want to set up conditions based on the commit or message, but on the state of stages in the pipeline. Sequential execution is fine, but some stages should be skipped in some cases. Commented Nov 15, 2019 at 9:50

1 Answer 1

7

A pretty simple solution is to declare a global variable on top of your pipeline, and check it's value in your last conditional stage:

def flag = false; pipeline { stages { stage('1 - Always') { steps { sh './always.sh' } } stage('2 - Maybe') { when { condition } steps { sh './maybe.sh' script { flag = true } } } stage('3 - If Maybe was executed') { when { expression { flag == true } } steps { sh './conditional.sh' } } } } 

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.