Lockable Resource Plugin Lockable Resources Manager Lockable Resources resource: testing1-repository, labels:testing-repository resource: testing2-repository, labels:testing-repository resource: testing3-repository, labels:testing-repository
Configured these 3 resources in Jenkins. Different resource name and same label on all three resources. Pipeline script: def stepsForParallel = [:] stepsForParallel["nodeName1"] = transformIntoStep("nodeName1") stepsForParallel["nodeName2"] = transformIntoStep("nodeName2") stepsForParallel["nodeName3"] = transformIntoStep("nodeName3") stepsForParallel["nodeName4"] = transformIntoStep("nodeName4") parallel stepsForParallel def transformIntoStep(nodeName) { return { node("master") { if (nodeName.equals("nodeName4")) { lock(label: "testing-repository") { println "Testing lock label" sleep 20 } } else { sleep 5 /* to make sure nodeName4 aquires its lock first. */ if (nodeName.equals("nodeName1")) { lock(resource: 'testing1-repository') { println "Testing lock resource" sleep 10 } } if (nodeName.equals("nodeName2")) { lock(resource: 'testing2-repository') { println "Testing lock resource" sleep 10 } } if (nodeName.equals("nodeName3")) { lock(resource: 'testing3-repository') { println "Testing lock resource" sleep 10 } } } } } } [Pipeline] parallel [Pipeline] [nodeName1] { (Branch: nodeName1) [Pipeline] [nodeName2] { (Branch: nodeName2) [Pipeline] [nodeName3] { (Branch: nodeName3) [Pipeline] [nodeName4] { (Branch: nodeName4) [Pipeline] [nodeName1] node [nodeName1] Running on Jenkins in /var/lib/jenkins/workspace/pipeline-test [Pipeline] [nodeName2] node [nodeName2] Running on Jenkins in /var/lib/jenkins/workspace/pipeline-test@2 [Pipeline] [nodeName3] node [nodeName3] Running on Jenkins in /var/lib/jenkins/workspace/pipeline-test@3 [Pipeline] [nodeName4] node [Pipeline] [nodeName1] { [Pipeline] [nodeName2] { [Pipeline] [nodeName3] { [nodeName4] Running on Jenkins in /var/lib/jenkins/workspace/pipeline-test@4 [Pipeline] [nodeName1] sleep [nodeName1] Sleeping for 5 sec [Pipeline] [nodeName2] sleep [nodeName2] Sleeping for 5 sec [Pipeline] [nodeName3] sleep [nodeName3] Sleeping for 5 sec [Pipeline] [nodeName4] { [Pipeline] [nodeName4] lock [nodeName4] Trying to acquire lock on [Label: testing-repository] [nodeName4] Lock acquired on [Label: testing-repository] [Pipeline] [nodeName4] { [Pipeline] [nodeName4] echo [nodeName4] Testing lock label [Pipeline] [nodeName4] sleep [nodeName4] Sleeping for 20 sec [Pipeline] [nodeName1] lock [nodeName1] Trying to acquire lock on [testing1-repository] [nodeName1] Found 0 available resource(s). Waiting for correct amount: 1. [nodeName1] [testing1-repository] is locked, waiting... [Pipeline] [nodeName2] lock [nodeName2] Trying to acquire lock on [testing2-repository] [nodeName2] Found 0 available resource(s). Waiting for correct amount: 1. [nodeName2] [testing2-repository] is locked, waiting... [Pipeline] [nodeName3] lock [nodeName3] Trying to acquire lock on [testing3-repository] [nodeName3] Found 0 available resource(s). Waiting for correct amount: 1. [nodeName3] [testing3-repository] is locked, waiting... [nodeName1] Lock acquired on [testing1-repository] [Pipeline] [nodeName4] } [nodeName4] Lock released on resource [Label: testing-repository] [Pipeline] [nodeName1] { [Pipeline] [nodeName4] // lock [Pipeline] [nodeName4] } [Pipeline] [nodeName1] echo [nodeName1] Testing lock resource [Pipeline] [nodeName1] sleep [nodeName1] Sleeping for 10 sec [Pipeline] [nodeName4] // node [Pipeline] [nodeName4] } [Pipeline] [nodeName1] } [nodeName1] Lock released on resource [testing1-repository] [Pipeline] [nodeName1] // lock [Pipeline] [nodeName1] } [Pipeline] [nodeName1] // node [Pipeline] [nodeName1] } Does not work as I expected it to. When nodeName4 releases the testing-repository which contains 3 resources, then the other can acquire the lock on their resources. However only one of them does so, the others do not. The entire build hangs and goes no further. [nodeName1] Lock acquired on [testing1-repository] [nodeName4] Lock released on resource [Label: testing-repository] [nodeName1] Lock released on resource [testing1-repository] Do not know why nodeName1 acquired the lock before nodeName released. This is the output I expected: [nodeName4] Trying to acquire lock on [Label: testing-repository] [nodeName4] Lock acquired on [Label: testing-repository] [nodeName4] Lock released on resource [Label: testing-repository] [nodeName1] Lock acquired on [testing1-repository] [nodeName2] Lock acquired on [testing2-repository] [nodeName3] Lock acquired on [testing3-repository] [nodeName1] Lock released on resource [testing1-repository] [nodeName2] Lock released on resource [testing2-repository] [nodeName3] Lock released on resource [testing3-repository] -- You received this message because you are subscribed to the Google Groups "Jenkins Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to jenkinsci-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/jenkinsci-users/24bddcbd-1303-4f5a-91d7-3e53be443be2%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.