If job cannot lock resources, provide finer control, instead of just queuing. {code:java} options{ lock( ifLocked:'abort' ,extra:[[resource:'resource1'],[resource:'resource2']]) }{code}
With timeout field ? JENKINS-41699 {code:java} options{ lock( timeout: 4, onTimeout:'abort' ,extra:[[resource:'resource1'],[resource:'resource2']]) }{code}
If job cannot lock resources, provide finer control, instead of just queuing. {code:java} options{ lock( ifLocked:'abort' ,extra:[[resource:'resource1'],[resource:'resource2']]) }{code}
With timeout field ? JENKINS-41699 {code:java} options{ lock( timeout: 4, onTimeout:'abort' ,extra:[[resource:'resource1'],[resource:'resource2']]) }{code}
This pipeline demonstrates the desired effect, but is unusable inside the sandbox. {code:java} //envLock = [envResource1, envResource2] //workspaceLock = [wsResource1, wsResouece2]
pipeline{ options { lock(extra: [[label:envLock, quantity: 1], [label:workspaceLock, quantity: 1]]) } stages { stage('Resource Availability Check'){ when { expression { LockMan.get().getFreeResourceAmount(envLock) == 0 || LockMan.get().getFreeResourceAmount(workspaceLock) == 0 } } steps{ script{ currentBuild.result = 'ABORTED' error('Some other Pipeline is already using the resources, please try again later.') } } } stage('Install/Update Tools'){ steps{ echo ("./gradlew install") }} }}{code}
If job cannot lock resources, provide finer control, instead of just queuing. {code:java} options{ lock( ifLocked:'abort' ,extra:[[resource:'resource1'],[resource:'resource2']]) }{code}
With timeout field ? JENKINS-41699 {code:java} options{ lock( timeout: 4, onTimeout:'abort' ,extra:[[resource:'resource1'],[resource:'resource2']]) }{code}
This pipeline demonstrates the desired effect, but is unusable inside the sandbox. {code:java}
/* First build acquires one of two locks. Second build acquires the second lock, but the resource check step aborts the job if all locks are used up. Additional builds will queue and eventually fall into one of the first two scenarios */