Jenkins使用IF语句的管道问题

时间:2019-09-19 16:15:46

标签: jenkins jenkins-pipeline

我有一个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。

非常感谢您提供的帮助。

0 个答案:

没有答案