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 } } } } }}
Very naïve thought(s):
While “Do not know why nodeName1 acquired the lock before nodeName released.“ might be just a matter of output flushing/buffering, “The entire build hangs and goes no further.” sounds really frightening to me.
Maybe it is the usage of lock inside parallel step and/or some CPS transformation reason, or some little resource misconfiguration issue!?
Ignoring CPS transformations (due to parallel step) I assume/hope the lock plugin does unit testing the “normal” parallelization usage of locking resources?
Very naïve thought(s):
While “Do not know why nodeName1 acquired the lock before nodeName released.“ might be just a matter of output flushing/buffering,
“The entire build hangs and goes no further.” sounds really frightening to me.
Maybe it is the usage of lock inside parallel step and/or some CPS transformation reason, or some little resource misconfiguration issue!?
Ignoring CPS transformations (due to parallel step) I assume/hope the lock plugin does unit testing the “normal” parallelization usage of locking resources?
stage("build") {
def stepsForParallel = [:]
stepsForParallel[buildNode1] = transformIntoStep(buildNode1)
stepsForParallel[buildNode2] = transformIntoStep(buildNode2)
lock(resource: 'master-repository') {
parallel stepsForParallel
}
}
stage("publish") {
lock(resource: 'master-repository') {
publishYumArtifacts()
}
}
def transformIntoStep() {
return {
node(nodeName) {
preInstall()
compileAndBuild()
postInstall()
}
}
}
stage("build") {
def stepsForParallel = [:]
stepsForParallel[buildNode1] = transformIntoStep(buildNode1)
stepsForParallel[buildNode2] = transformIntoStep(buildNode2)
parallel stepsForParallel
}
stage("publish") {
lock(label: 'master-repository') {
publishYumArtifacts()
}
}
def transformIntoStep(nodeName) {
return {
node(nodeName) {
lock(resource: nodeName) { preInstall() }
compileAndBuild()
lock(resource: nodeName) { postInstall() } }
}
}
def stepsForParallel = [:]
stepsForParallel["nodeName4"] = transformIntoStep("nodeName4")
parallel stepsForParallel
def transformIntoStep(nodeName) {
return {
node("master") {
lock(label: "testing-repository") {
println "Testing lock label"
sleep 60
}
}
}
}
def stepsForParallel = [:]
stepsForParallel["nodeName1"] = transformIntoStep("nodeName1")
stepsForParallel["nodeName2"] = transformIntoStep("nodeName2")
stepsForParallel["nodeName3"] = transformIntoStep("nodeName3")
parallel stepsForParallel
def transformIntoStep(nodeName) {
return {
node("master") {
if (nodeName.equals("nodeName1")) {
lock(resource: 'testing1-repository') {
println "Testing lock resource"
sleep 30
}
}
if (nodeName.equals("nodeName2")) {
lock(resource: 'testing2-repository') {
println "Testing lock resource"
sleep 30
}
}
if (nodeName.equals("nodeName3")) {
lock(resource: 'testing3-repository') {
println "Testing lock resource"
sleep 30
}
}
}
}
}
Looks like there is a fix for this in the works.