3

我在构建期间执行的 Jenkinsfile 中运行以下 groovy 脚本:

import java.util.stream.Collectors
import java.util.stream.Stream
import groovy.transform.Field

@Field
Map<String, String> sampleMap = [
        'SampleKey1': 'SampleValue1',
        'SampleKey2': 'SampleValue2'
]

//example param value: "C/SampleKey1/someFile, C/SampleKey2/someFile2"
private Collection<String> getValues(String param) {
    Stream.of(param.split(','))
            .map { getValueFromOnePath(it) }
            .filter { !it.isEmpty() }
            .distinct()
            .collect(Collectors.toList())
}

private String getValueFromOnePath(String path) {
    String[] pathParts = path.split('/')
    if (pathParts.size() < 2) {
        return ''
    }
    return sampleMap[pathParts[1]] ?: ''
}

上述代码对参数值的预期结果等于:

"C/SampleKey1/someFile, C/SampleKey2/someFile2"

是:

[SampleValue1, SampleValue2]

但是,当在 Jenkins 上执行此代码时,我收到一个我无法理解的奇怪错误(为什么会发生):

hudson.remoting.ProxyException:org.codehaus.groovy.runtime.typehandling.GroovyCastException:无法在 org.codehaus.groovy.runtime 将对象“SampleValue1”与“java.lang.String”类转换为“java.util.Collection”类.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:405) 在 org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:319) 在 org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnCollection(DefaultTypeTransformation .java:267) 在 org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:603) 在 org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:219) 在 Unknown。未知(未知)在cps.transform(本机方法)在 com.cloudbees.groovy.cps.impl.LocalVariableBlock$LocalVariable.set(LocalVariableBlock.java:45) 在 com.cloudbees.groovy.cps.impl.AssignmentBlock$ContinuationImpl.assignAndDone(AssignmentBlock.java:70)在 sun.reflect.GeneratedMethodAccessor303.invoke(Unknown Source) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 com.cloudbees.groovy .cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72) at com.cloudbees.groovy.cps.impl.LocalVariableBlock$LocalVariable.get(LocalVariableBlock.java:39) at com.cloudbees.groovy.cps.LValueBlock $GetAdapter.receive(LValueBlock.java:30) 在 com.cloudbees.groovy.cps.impl.LocalVariableBlock.evalLValue(LocalVariableBlock.java:28) 在 com.cloudbees.groovy.cps.LValueBlock$BlockImpl.eval(LValueBlock.java:55) at com.cloudbees.groovy.cps.LValueBlock.eval(LValueBlock.java:16) at com.cloudbees.groovy.cps.Next.step( Next.java:83) 在 com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174) 在 com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163) 在 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) 在 org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:19) 在 org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:35) 在org.jenkinsci。plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:32) at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108) at org.jenkinsci.plugins.workflow.cps .SandboxContinuable.run0(SandboxContinuable.java:32) 在 org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174) 在 org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java :331) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:82) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:243) at org. jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:231) 在 org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64) 在 java.util。concurrent.FutureTask.run(FutureTask.java:266) at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112) at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) at java.util.concurrent .Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java. util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run(Thread.java:748)28) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor) 的 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) .java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run(Thread.java:748)28) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor) 的 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) .java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run(Thread.java:748)

有任何想法吗?

4

1 回答 1

-1

您可以尝试使用 @NonCPS 注释对 getValues 进行注释。还要尽量避免在将在 Jenkins 沙箱中执行的代码中使用 Streams,这通常会导致错误。希望能帮助到你。

于 2020-04-14T09:52:08.040 回答