对该脚本的访问将阻止Jenkins Pipelines脚本
我将以下测试Groovy脚本作为对该脚本的访问将阻止Jenkins Pipelines脚本,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我将以下测试Groovy脚本作为vars添加到workflow libs: #!/usr/bin/groovy this.test = false def setTest(boolean test) { this.test = test } def getTest() { this.test } def log(level, msg) { echo "[${level}] ${msg}" } def call(msg) { if (this.test) log('TES
vars
添加到workflow libs
:
#!/usr/bin/groovy
this.test = false
def setTest(boolean test) { this.test = test }
def getTest() { this.test }
def log(level, msg) {
echo "[${level}] ${msg}"
}
def call(msg) {
if (this.test) log('TEST', msg)
}
我将此脚本放在工作流libs/vars/test.groovy
下
当我执行以下管道时:
node {
test 'foo'
}
这个过程永远不会结束,但是如果我删除if(this.test)
则它会正常结束,尽管我得出结论,访问这个
对象时会出现问题
有人面临类似的行为吗
Jenkins是time 1.651.3的最新版本。在groovy
中,这个测试调用自动生成的或现有的gettergetTest()
()。您的脚本只是停留在无限递归中
介绍了如何在groovy中直接访问字段,尽管我不确定它是否能在管道中工作
或者,您可以只使用脚本范围的变量test
,而不是this.test
。或者将this.test
重命名为与访问器方法名称不同的名称,如this.\u test
最后,我使用this
的binding
对象克服了这个问题,如下所示:
def enableTest(enable = true) {
// this goes to binding variables
this.test = enable }
使用变量集(如果已设置!)
希望有帮助谢谢@izzeki您的提示最终引导我进一步挖掘对象,并发现实际参数位于this.binding.variables下,这是一个映射对象,如果有人感兴趣或可以提供更好的解决方案,我会将此发现作为答案@tbo。您可能会发现,知道绑定是不可序列化的,但它具有Map getVariables()
方法也很有用。
if (this.binding.variables['test'] && this.test) {
// do something usefull
}