为什么这个简单的Groovy脚本在Jenkins管道中失败了?

为什么这个简单的Groovy脚本在Jenkins管道中失败了?,groovy,jenkins-pipeline,jenkins-groovy,Groovy,Jenkins Pipeline,Jenkins Groovy,我可以在Groovy和Jenkins的脚本控制台中运行它 def generator = { String alphabet, int n -> new Random().with { (1..n).collect { alphabet[ nextInt( alphabet.length() ) ] }.join() } } node('node-0') { stage('test') { println generator( (('A'..'Z'

我可以在Groovy和Jenkins的脚本控制台中运行它

def generator = { String alphabet, int n ->
  new Random().with {
    (1..n).collect { alphabet[ nextInt( alphabet.length() ) ] }.join()
  }
}

node('node-0') {
    stage('test') {
        println generator( (('A'..'Z')+('0'..'9')).join(), 9 )
    }
}
但当我在管道中运行时,我得到了这个。为什么?

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.join() is applicable for argument types: () values: []
Possible solutions: join(java.lang.String), min(), min(java.util.Comparator), min(groovy.lang.Closure), wait(), find()
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:153)
    at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:158)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:162)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:17)
    at WorkflowScript.run(WorkflowScript:11)
    at ___cps.transform___(Native Method)
    at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:86)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:113)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixName(FunctionCallBlock.java:78)
    at sun.reflect.GeneratedMethodAccessor338.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    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:129)
    at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:268)
    at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:51)
    at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:185)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:400)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$400(CpsThreadGroup.java:96)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:312)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:276)
    at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:67)
    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:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Finished: FAILURE

我让它像这样工作,但我不能确切地回答“为什么”。使用Groovy沙盒时,不带参数的
join()
重载显然不可用。
.with{}
方法可能因为CPS转换而无法工作(无论是否使用“Groovy sandbox”,它都无法工作)


我让它像这样工作,但我不能确切地回答“为什么”。使用Groovy沙盒时,不带参数的
join()
重载显然不可用。
.with{}
方法可能因为CPS转换而无法工作(无论是否使用“Groovy sandbox”,它都无法工作)


不确定jenkins在做什么,但是
.join(“”)
应该可以修复it@tim_yates. 我在两个位置调用了
.join()
,但将
'
放在其中一个位置并没有解决问题。您使用的是哪个版本的Jenkins?对我来说,在Jenkins 2.227上,代码失败了,出现了一个不同的错误:“java.lang.NoSuchMethodError:在步骤中找不到这样的DSL方法‘nextInt’。@ChrisF两个都试过了吗?@zett42尝试使用checking Groovy sandbox check Box不确定Jenkins在做什么,但是
。join(“”)
应该修复it@tim_yates. 我在两个位置调用了
.join()
,但将
'
放在其中一个位置并没有解决问题。您使用的是哪个版本的Jenkins?对我来说,在Jenkins 2.227上,代码失败了,出现了另一个错误:“java.lang.NoSuchMethodError:在步骤中找不到这样的DSL方法‘nextInt’。@ChrisF两个都试过了吗?@zett42尝试使用checking Groovy sandbox复选框
def generator = { String alphabet, int n ->
  def rnd = new Random()   // because .with{} doesn't work
  (1..n).collect { alphabet[ rnd.nextInt( alphabet.length() ) ] }.join('')
}

node('node-0') {
    stage('test') {
        println generator( (('A'..'Z')+('0'..'9')).join(''), 9 )
    }
}