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
script. The script step takes a block of scripted-pipeline and executes that in the Declarative Pipeline.
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.
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!" } } } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With