gpt4 book ai didi

Jenkins 管道抛出 "StackOverflowError: Excessively nested closures/functions"

转载 作者:行者123 更新时间:2023-12-04 14:38:35 27 4
gpt4 key购买 nike

我有以下Jenkinsfile:

#!groovy

def projectPath = "${projectPath}"
def specPath = "${specPath}"
int numberOfRetries = "${NUM_OF_RETRIES}".toInteger()

def failure = true
def retryAmount = 0
def start = System.currentTimeMillis()

def getSpecName() {
specPath.split("/")[-1].split(".")[0]
}

def getProjectPath() {
projectPath.split("/")[-1]
}

def rmDocker() {
def remove = sh script: "docker rm -f cypress_${getSpecName()}", returnStatus: true
}

stage("Cypress Setup") {
node("Cypress") {
rmDocker()
}
}

stage("Cypress Run") {
node("Cypress") {
currentBuild.setDisplayName("${projectPath} - ${getSpecName()}")
while (failure && retryAmount < numberOfRetries) {
sh "docker pull dockreg.bluestembrands.com/cypresswithtests:latest"
if (getSpecName().toLowerCase().contains("auth")) {
exit_code = sh script:"docker run --name cypress_${getSpecName()} dockreg.bluestembrands.com/cypresswithtests:latest sh -c \"node SQLSite/request.js & cypress run -P ${projectPath} --spec ${specPath} --env RUN=${retryAmount} --config videoCompression=${videoCompression} --reporter /usr/local/lib/node_modules/mochawesome-cypress-bsb --reporter-options \"reportDir=mochawesome-reports/run${retryAmount}/, reportName=mochawesome\"\"", returnStatus: true
} else {
exit_code = sh script:"docker run --name cypress_${getSpecName()} dockreg.bluestembrands.com/cypresswithtests:latest sh -c \"cypress run -P ${projectPath} --spec ${specPath} --env RUN=${retryAmount} --config videoCompression=${videoCompression} --reporter /usr/local/lib/node_modules/mochawesome-cypress-bsb --reporter-options \"reportDir=mochawesome-reports/run${retryAmount}/, reportName=mochawesome\"\"", returnStatus: true
}
failure = exit_code != 0
try {
println "/var/docker-mounts/nfs/qa/test-results/${getProjectPath()}-${getSpecName()}/"
dir("/var/docker-mounts/nfs/qa/test-results/${getProjectPath()}-${getSpecName()}/") {
sh "docker cp cypress_${getSpecName()}:/cypress/${projectPath}/mochawesome-reports /var/docker-mounts/nfs/qa/test-results/${getProjectPath()}-${getSpecName()}/${BUILD_ID}"
}
} catch (Exception e) {
println e
echo "Failed to copy Mochawesome tests"
}
rmDocker()
retryAmount++
}
}

if (failure) {
currentBuild.result = "FAILURE"
}
}

当我尝试运行它时,它将引发以下异常:
java.lang.StackOverflowError: Excessively nested closures/functions at WorkflowScript.getProjectPath(WorkflowScript:16) - look for unbounded recursion - call depth: 1025
at com.cloudbees.groovy.cps.impl.CpsFunction.invoke(CpsFunction.java:28)
at com.cloudbees.groovy.cps.impl.CpsCallableInvocation.invoke(CpsCallableInvocation.java:40)
at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:62)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:109)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixName(FunctionCallBlock.java:77)
at sun.reflect.GeneratedMethodAccessor345.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
at com.cloudbees.groovy.cps.Next.step(Next.java:83)
at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:122)
at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:261)
at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$101(SandboxContinuable.java:34)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.lambda$run0$0(SandboxContinuable.java:59)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:58)
at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:332)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:83)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:244)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:232)
at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

变量是:

NUM_OF_RETRIES:3

specPath:bsb-haband-web/hab-shop/cypress/integration/Search/SearchNoResultsSpec.js

VideoCompression:错误

projectPath:bsb-haband-web/hab-shop

BRANCH_NAME:大师

我不知道递归调用在哪里发生,因为 getProjectPath只是进行标准的拆分调用。

我尝试将其更改为 .tokenize(),但仍然失败。

可能需要注意的是,其中多个可以同时运行,但是即使单独运行也会出现错误。

您能帮我理解为什么 StackOverflowError发生的原因吗?

最佳答案

调用getProjectPath()方法会导致此异常。之所以发生这种情况是因为,如果Groovy为诸如foo之类的字段getFoo()找到一个getter方法,则它回落以在看到访问foo值时执行该方法。

在您的情况下是什么意思?调用方法时

def getProjectPath() {
projectPath.split("/")[-1]
}

它会遇到无限递归,因为此方法被视为:
def getProjectPath() {
getProjectPath().split("/")[-1]
}

因此它永远不会到达 .split("/")[-1]-这就是为什么用 tokenize()方法替换它不会改变任何事情的原因。

解决方案:重命名 getProjectPath()方法或 projectPath变量名称。

Groovy类的属性

A property is an externally visible feature of a class. Rather than just using a public field to represent such features (which provides a more limited abstraction and would restrict refactoring possibilities), the typical convention in Java is to follow JavaBean conventions, i.e. represent the property using a combination of a private backing field and getters/setters.

Source: http://groovy-lang.org/objectorientation.html#properties



Groovy的文档的这一部分解释了此行为。可以简化为一个示例-一个类似这样的类:
class Person {
String name
}

被编译成这样的东西:
class Person {
private String name

void setName(String name) {
this.name = name
}

String getName() {
return this.name
}
}

使用Groovy的一般经验法则是,当您指定字段 foo时,请仔细实现 getFoo()(如果实际上必须这样做)。特别是,您避免访问此方法内部的 foo字段,因为它会遇到无限递归调用问题。

关于 Jenkins 管道抛出 "StackOverflowError: Excessively nested closures/functions",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50705680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com