Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to lock multiple stages of declarative Jenkins pipeline?

I want to run multiple stages inside a lock within a declarative Jenkins pipeline:

pipeline {     agent any     stages {         lock(resource: 'myResource') {             stage('Stage 1') {                 steps {                   echo "my first step"                 }             }              stage('Stage 2') {                 steps {                   echo "my second step"                 }             }          }     } } 

I get the following error:

Started by user anonymous org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: WorkflowScript: 10: Expected a stage @ line 10, column 9.            lock(resource: 'myResource') {            ^  WorkflowScript: 10: Stage does not have a name @ line 10, column 9.            lock(resource: 'myResource') {            ^  WorkflowScript: 10: Nothing to execute within stage "null" @ line 10, column 9.            lock(resource: 'myResource') {            ^  3 errors      at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)     at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)     at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)     at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)     at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)     at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)     at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)     at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)     at groovy.lang.GroovyShell.parse(GroovyShell.java:700)     at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:116)     at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:430)     at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:393)     at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:257)     at hudson.model.ResourceController.execute(ResourceController.java:97)     at hudson.model.Executor.run(Executor.java:405) Finished: FAILURE 

What's the problem here? The documentation explicitly states:

lock can be also used to wrap multiple stages into a single concurrency unit

like image 734
John Avatar asked May 21 '17 16:05

John


People also ask

What block can be used to control if a stage runs in a Declarative pipeline?

script. The script step takes a block of scripted-pipeline and executes that in the Declarative Pipeline.

Can we have multiple steps in a stage in Jenkins?

Jenkins Pipeline allows you to compose multiple steps in an easy way that can help you model any sort of automation process. Think of a "step" like a single command which performs a single action. When a step succeeds it moves onto the next step. When a step fails to execute correctly the Pipeline will fail.


1 Answers

It should be noted that you can lock all stages in a pipeline by using the lock option:

pipeline {     agent any     options {         lock resource: 'shared_resource_lock'     }     stages {         stage('will_already_be_locked') {             steps {                 echo "I am locked before I enter the stage!"             }         }         stage('will_also_be_locked') {             steps {                 echo "I am still locked!"             }         }     } } 
like image 56
dolphy Avatar answered Sep 20 '22 21:09

dolphy