我正在尝试为我的脚本管道构建一个方便的共享库。
我希望能够使用Jenkins文件中的一个具有多种功能方法的对象,但也存储了一些由多种方法引用的初始变量。
所以,我在“vars”中定义了一个带有一堆功能方法的文件,还有一些get / set方法用于我想要存储在对象中的属性,以供多种方法参考。
我的初步测试只是设置一些变量(不是全部)并调用我在文件中定义的“toString()”方法(显然只是为了惯例)。
在我的测试Jenkinsfile中,如果我设置了所有变量,然后调用“toString()”,它就可以正常工作并完成。
但是,如果我尝试注释掉其中一个变量初始化,当它遇到构造返回值的“toString”方法中的行时,Jenkins就会永远挂起。我最终只是杀了这份工作。
我已经能够通过使用“if binding.variables.containsKey("foo")) {
”限定每个引用来避免挂起,只有在该引用为真时才引用变量。我通过在每个getter方法中加入绑定检查来使这一点变得更加清晰。
我真的不喜欢这种解决方法。我必须做到这一点似乎很奇怪。
我尝试了几种变体,但是我没有设置变量,我尝试在gstring中引用它,每次都会挂起作业。
这是“vars”文件的简要摘录:
def setJobName(value) { jobName = value; }
//def getJobName() { return jobName }
def getJobName() { return (binding.variables.containsKey("jobName") ? jobName : "") }
def setMechIdCredentials(value) { mechIdCredentials = value; }
//def getMechIdCredentials() { return mechIdCredentials }
def getMechIdCredentials() { return (binding.variables.containsKey("mechIdCredentials") ? mechIdCredentials : "") }
... more get/set methods
String toString() {
echo "Inside uslutils.toString()."
这是Jenkins文件的摘录,使用了这个:
uslutils.currentBuild = currentBuild
uslutils.jobName = env.JOB_NAME
uslutils.buildURL = env.BUILD_URL
//uslutils.mechIdCredentials = "abc"
return "[currentBuild[${currentBuild}] mechIdCredentials[${mechIdCredentials}] " +
"baseStashURL[${baseStashURL}] jobName[${jobName}] codeBranch[${codeBranch}] " +
"codeURL[${codeURL}] buildURL[${buildURL}] pullRequestURL[${pullRequestURL}] QBotUserID[${QBotUserID}] " +
"QBotPassword[${QBotPassword}]]"
}
因此,例如,如果我交换了“getMechIdCredentials”的两个变体,保留了“plain”,那么这个样本组合将会挂起,直到我点击Jenkins中“Progress”指示器上的红色X. / p>
更新:
因此,根据反馈,我在文件中定义了变量并更改了我的getter / setter以使用“this。@ var”语法。结果,构建失败,“没有这样的字段:var for class:uslutils”。
我想我定义字段的语法不正确,但这里是我所拥有的内容的摘录:
def currentBuild = ""
String jobName = ""
String buildURL = ""
def mechIdCredentials = ""
def setCurrentBuild(value) { this.@currentBuild = value; }
def getCurrentBuild() { return this.@currentBuild }
def setJobName(value) { this.@jobName = value; }
def getJobName() { return this.@jobName }
def setBuildURL(value) { this.@buildURL = value; }
def getBuildURL() { return this.@buildURL }
def setMechIdCredentials(value) { this.@mechIdCredentials = value; }
def getMechIdCredentials() { return this.@mechIdCredentials }
请注意,这不在“类”声明中,它位于名为“uslutils.groovy”的Groovy脚本文件中。
要清楚,这里是我得到的堆栈跟踪的摘录:
groovy.lang.MissingFieldException: No such field: mechIdCredentials for class: uslutils
at groovy.lang.MetaClassImpl.getAttribute(MetaClassImpl.java:2823)
at groovy.lang.MetaClassImpl.getAttribute(MetaClassImpl.java:3759)
at org.codehaus.groovy.runtime.InvokerHelper.getAttribute(InvokerHelper.java:145)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.getField(ScriptBytecodeAdapter.java:306)
at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.getAttribute(DefaultInvoker.java:42)
at com.cloudbees.groovy.cps.impl.AttributeAccessBlock.rawGet(AttributeAccessBlock.java:20)
at uslutils.getMechIdCredentials(/opt/app/jenkins/sdt-usl/data/jobs/uslutils-tests/builds/33/libs/usl-pipeline-library/vars/uslutils.groovy:197)
at uslutils.toString(/opt/app/jenkins/sdt-usl/data/jobs/uslutils-tests/builds/33/libs/usl-pipeline-library/vars/uslutils.groovy:242)
at WorkflowScript.run(WorkflowScript:13)
第242行显示在这里:
String toString() {
echo "Inside uslutils.toString()x."
return "[currentBuild[${currentBuild}] mechIdCredentials[${mechIdCredentials}] " + // line 242
"baseStashURL[${baseStashURL}] jobName[${jobName}] codeBranch[${codeBranch}] " +
"codeURL[${codeURL}] buildURL[${buildURL}] pullRequestURL[${pullRequestURL}] QBotUserID[${QBotUserID}] " +
"QBotPassword[${QBotPassword}]]"
}