我有一个Jenkins脚本化管道,我在其中使用IF语句来确定要部署到AWS的Lambda。如果我尝试部署Lambda列表,然后尝试部署Lambda的辅助列表,则我的Jenkins作业将失败。
以下是在第一组Lambdas成功运行后尝试部署第二组Lambda时在Jenkins中遇到的错误。
hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: java.lang.Boolean.call() is applicable for argument types: (org.jenkinsci.plugins.workflow.cps.CpsClosure2) values: [org.jenkinsci.plugins.workflow.cps.CpsClosure2@33072452]
Possible solutions: wait(), any(), wait(long), and(java.lang.Boolean), each(groovy.lang.Closure), any(groovy.lang.Closure)
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:70)
at ___cps.transform___(Native Method)
at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:84)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:113)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:83)
at sun.reflect.GeneratedMethodAccessor275.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.ClosureBlock.eval(ClosureBlock.java:46)
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:186)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:370)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:93)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:282)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:270)
at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:66)
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)
此过程允许Jenkins消费者根据Lambda的文件夹结构选择是部署单个Lambda还是部署一组Lambda。
以下是Jenkins文件中的摘录,该摘录创建了基于用户输入部署的Lambda列表。用户可以根据该输入选择部署一个lambda或一组lambda,下面的代码基于该输入,然后确定将处理哪些lambda并将其上传到AWS。
IF语句的第一部分将检查用户是否仅部署一个或多个lambda。第二个查找具有文件夹名称“ lambdas-A”的lambda,然后最后一个查找“ lambdas-B”文件夹中的lambda。
stage('checkout')
{
println('Cleaning up old files from directory')
sh "rm -rf /home/ubuntu/workspace/${env.JOB_NAME}/*"
checkout scm
if(lambda_name && lambda_name != "lambda-A-*" && lambda_name != "lambda-B-*")
{
def lambda = lambda_name.split("\\r?\\n")
sh "echo $lambda >> lambdalist"
sh "sed -e 's/, /\\n/g' lambdalist | tr -d '[]' > lambda-list"
}
else if(lambda_name == "lambda-A-*")
{
sh "rm -rf lambdalist lambda-list"
sh "ls -d lambdas/lambda-A-* >> lambda-list"
sh "sed -i 's/^\\w*\\ *//' lambda-list"
sh "sed -i 's/[/]//g' lambda-list"
}
else(lambda_name == "lambda-B-*")
{
sh "rm -rf lambdalist lambda-list"
sh "ls -d lambdas/lambda-B-* >> lambda-list"
sh "sed -i 's/^\\w*\\ *//' lambda-list"
sh "sed -i 's/[/]//g' lambda-list"
}
奇怪的是,如果我最初在lambda-A中部署Lambda,则该作业将成功运行。如果我切换为在组B(lambda-B)中部署lambda,则会收到上述错误。但是,如果我从这两个组中的任何一个部署了一个lambda,则该作业将很好地部署。
预期的行为应该是,用户可以启动Jenkins作业并在A组中部署Lambda,然后继续触发该作业以在B组中毫无问题地部署Lambda。
非常感谢您提供的帮助。