-
Bug
-
Resolution: Unresolved
-
Minor
-
None
I've got a groovy script that I call using load() in my Jenkinsfile. I needed it to call itself with a different parameter when exception handling. However, it doesn't call itself in a way you would expect:
def call(in_path) { timeout(1) { def my_path = in_path print "Start of call(${my_path}) FINDMEAGAIN" lock ("mylock") { print "Start of call(${my_path}):lock block" try { print "Start of call(${my_path}):try block" error "Nope!" } catch (err) { print "In Exception - calling self" def my_pathp = my_path + "X" if (my_pathp.length() < 50) { print "Calling call(${my_pathp})" call(my_pathp) } print "Back to call(${my_path})" } } return null } }
You would expect to see the FINDMEAGAIN in the console multiple times. Or you would expect the lock to hang trying to re-lock. Instead, I get this:
Start of call(rpms/centos7) FINDMEAGAIN [Pipeline] lock Trying to acquire lock on [mylock] Lock acquired on [mylock] [Pipeline] { [Pipeline] echo Start of call(rpms/centos7):lock block [Pipeline] echo Start of call(rpms/centos7):try block [Pipeline] error [Pipeline] echo In Exception - calling self [Pipeline] echo Calling call(rpms/centos7X) [Pipeline] echo Start of call(rpms/centos7):lock block [Pipeline] echo Start of call(rpms/centos7):try block [Pipeline] error [Pipeline] echo In Exception - calling self [Pipeline] echo Calling call(rpms/centos7X) [Pipeline] echo Start of call(rpms/centos7):lock block [Pipeline] echo Start of call(rpms/centos7):try block [Pipeline] error [Pipeline] echo In Exception - calling self
This repeats until a stack overflow. I assume the variables not changing is a groovy thing concerning references vs copies or something, but that doesn't explain why the call is not going to the top.
In experimenting, I found that if this snippet wasn't in call(), but something defined above it and called within, it worked as expected.