Jenkins作业永远挂起引用尚未设置的变量

时间:2017-02-19 23:12:32

标签: jenkins jenkins-pipeline

我正在尝试为我的脚本管道构建一个方便的共享库。

我希望能够使用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}]]"

}

0 个答案:

没有答案