Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins作业永远挂起,引用的变量没有';还没定下来_Jenkins_Jenkins Pipeline - Fatal编程技术网

Jenkins作业永远挂起,引用的变量没有';还没定下来

Jenkins作业永远挂起,引用的变量没有';还没定下来,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我正在尝试为我的脚本管道构建一个方便的共享库 我希望能够使用Jenkins文件中的一个对象,该对象具有多个函数方法,但也存储由多个方法引用的一些初始变量 因此,我在“vars”中定义了一个文件,其中包含一系列用于实现功能的方法,还有一些用于存储在对象中的属性的get/set方法,以供多种方法参考 我的初始测试只是设置一些变量(不是全部),并调用我在文件中定义的“toString()”方法(显然,只是为了约定) 在我的测试文件中,如果我设置了所有变量,然后调用“toString()”,那么它工作正

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

我希望能够使用Jenkins文件中的一个对象,该对象具有多个函数方法,但也存储由多个方法引用的一些初始变量

因此,我在“vars”中定义了一个文件,其中包含一系列用于实现功能的方法,还有一些用于存储在对象中的属性的get/set方法,以供多种方法参考

我的初始测试只是设置一些变量(不是全部),并调用我在文件中定义的“toString()”方法(显然,只是为了约定)

在我的测试文件中,如果我设置了所有变量,然后调用“toString()”,那么它工作正常并完成

但是,如果我尝试注释其中一个变量初始化,当它到达构造返回值的“toString”方法中的行时,Jenkins将永远挂起。我最终还是辞掉了这份工作

我已经能够通过使用“
if binding.variables.containsKey(“foo”){
”限定每个引用来避免挂起,仅在该值为真时才引用该变量。我将绑定检查放在每个getter方法中,从而使这一点更清晰

我真的不喜欢这种变通方法。我不得不这样做似乎很奇怪

我尝试了几种变体,但我没有设置变量,我尝试在gstring中引用它,每次作业都会永远挂起

这是“vars”文件的简短摘录:

这是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

更新

因此,根据反馈,我在文件中定义了变量,并将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}]]"

}

快速驾车评论:我相当肯定这是一个已知的问题;检查Jenkins bug追踪器。我只是查看了一下,搜索“text~”pipeline“和text~”hang“和(project!='HOSTING')以及status!='resolved'”。我没有看到任何与此匹配的内容(除了我申请的内容)。有两种情况下,报告者定义了一个变量,该变量的名称与从setter名称派生的属性的名称相同,但这不是我的情况。这看起来像是-when to
toString()
方法尝试解析
${mechIdCredentials}
,这会导致调用
getMechIdCredentials()
,它尝试
返回mechIdCredentials
,它不作为变量存在,因此Groovy尝试使用
getMechIdCredentials()
accessor方法-即进入无限循环。如果在
返回
之前向一个getter添加一个
回音
,您将看到这一点。好啊看起来很有希望。这是否意味着在上的“vars/acme.groovy”示例有缺陷?
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}]]"