Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-46163

Pipeline CPS Groovy does not seem to support spread '*' operator

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Minor Minor
    • pipeline
    • None
    • Jenkins ver. 2.60.2
      Pipeline 2.5
      Pipeline: Groovy 2.39
    • workflow-cps 3536.vb_8a_6628079d5

      It seems the groovy spread '*' operator causes compilation errors when it is used in Pipeline. This example code does not seem to compile:

      def fn (String... strs) {
          println "${strs.size()}"
      }
      
      def s = ["This should only be one string", "this is another"]
      def n = fn(*s)
      
      print(n)
      

      The exception we get is:

      java.lang.UnsupportedOperationException
      	at com.cloudbees.groovy.cps.CpsTransformer.visitSpreadExpression(CpsTransformer.java:1130)
      	at org.codehaus.groovy.ast.expr.SpreadExpression.visit(SpreadExpression.java:41)
      	at com.cloudbees.groovy.cps.CpsTransformer.visit(CpsTransformer.java:335)
      	at com.cloudbees.groovy.cps.CpsTransformer.visit(CpsTransformer.java:341)
      	at com.cloudbees.groovy.cps.CpsTransformer$4.run(CpsTransformer.java:482)
      	at com.cloudbees.groovy.cps.CpsTransformer.makeChildren(CpsTransformer.java:424)
      	at com.cloudbees.groovy.cps.CpsTransformer.makeNode(CpsTransformer.java:387)
      	at com.cloudbees.groovy.cps.CpsTransformer.visitMethodCallExpression(CpsTransformer.java:465)
      	at org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:66)
      	at com.cloudbees.groovy.cps.CpsTransformer.visit(CpsTransformer.java:335)
      	at com.cloudbees.groovy.cps.CpsTransformer$40.run(CpsTransformer.java:1083)
      	at com.cloudbees.groovy.cps.CpsTransformer.makeChildren(CpsTransformer.java:424)
      	at com.cloudbees.groovy.cps.CpsTransformer.makeNode(CpsTransformer.java:387)
      	at com.cloudbees.groovy.cps.CpsTransformer.visitDeclarationExpression(CpsTransformer.java:1076)
      	at org.codehaus.groovy.ast.expr.DeclarationExpression.visit(DeclarationExpression.java:89)
      	at com.cloudbees.groovy.cps.CpsTransformer.visit(CpsTransformer.java:335)
      	at com.cloudbees.groovy.cps.CpsTransformer.visitExpressionStatement(CpsTransformer.java:566)
      	at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42)
      	at com.cloudbees.groovy.cps.CpsTransformer.visit(CpsTransformer.java:335)
      	at com.cloudbees.groovy.cps.CpsTransformer.visit(CpsTransformer.java:341)
      	at com.cloudbees.groovy.cps.CpsTransformer$5.run(CpsTransformer.java:492)
      	at com.cloudbees.groovy.cps.CpsTransformer.makeChildren(CpsTransformer.java:424)
      	at com.cloudbees.groovy.cps.CpsTransformer.makeNode(CpsTransformer.java:387)
      	at com.cloudbees.groovy.cps.CpsTransformer.visitBlockStatement(CpsTransformer.java:489)
      	at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71)
      	at com.cloudbees.groovy.cps.CpsTransformer.visit(CpsTransformer.java:335)
      	at com.cloudbees.groovy.cps.CpsTransformer$2.run(CpsTransformer.java:366)
      	at com.cloudbees.groovy.cps.CpsTransformer.makeChildren(CpsTransformer.java:424)
      	at com.cloudbees.groovy.cps.CpsTransformer.makeNode(CpsTransformer.java:387)
      	at com.cloudbees.groovy.cps.CpsTransformer.visitWithSafepoint(CpsTransformer.java:352)
      	at com.cloudbees.groovy.cps.CpsTransformer.visitMethod(CpsTransformer.java:212)
      	at com.cloudbees.groovy.cps.CpsTransformer.call(CpsTransformer.java:126)
      	at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1065)
      	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
      	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
      	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
      	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
      	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
      	at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
      	at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
      	at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:129)
      	at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:123)
      	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:516)
      	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:479)
      	at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:269)
      	at hudson.model.ResourceController.execute(ResourceController.java:97)
      	at hudson.model.Executor.run(Executor.java:405)
      
      1 error
      
      	at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
      	at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)
      	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
      	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
      	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
      	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
      	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
      	at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
      	at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
      	at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:129)
      	at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:123)
      	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:516)
      	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:479)
      	at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:269)
      	at hudson.model.ResourceController.execute(ResourceController.java:97)
      	at hudson.model.Executor.run(Executor.java:405)
      Finished: FAILURE
      

          [JENKINS-46163] Pipeline CPS Groovy does not seem to support spread '*' operator

          Barak Korren added a comment -

          Not sure why this was marked as a duplicate of JENKINS-33051 - "spread" and "star-dot" look similar, but are completely different operators. Spread (Star preceding a collection in function argument list) is used for passing arrays as individual arguments when calling functions while star-dot (A star preceded by a collection and followed by a dot and a method reference) is used to iterate over collection members calling a method on each one.

          Barak Korren added a comment - Not sure why this was marked as a duplicate of JENKINS-33051 - "spread" and "star-dot" look similar, but are completely different operators. Spread (Star preceding a collection in function argument list) is used for passing arrays as individual arguments when calling functions while star-dot (A star preceded by a collection and followed by a dot and a method reference) is used to iterate over collection members calling a method on each one.

          I just ran into this as well and I'm disappointed to see this was closed as a dupe when it's a different command. Any solution abayer?

          Justin Rainwater added a comment - I just ran into this as well and I'm disappointed to see this was closed as a dupe when it's a different command. Any solution abayer ?

          AJ Schmidt added a comment - - edited

          AJ Schmidt added a comment - - edited This issue was closed and marked as a duplicate of  https://issues.jenkins-ci.org/browse/JENKINS-33051 However, the spread * and spread-dot *. operators are separate, not the same. See the below links for reference.   https://www.javaworld.com/article/2074149/groovy-s-spread-and-spread-dot-operators.html https://www.logicbig.com/tutorials/misc/groovy/spread-operator.html https://groovy-lang.org/operators.html#_spread_operator https://groovy-lang.org/operators.html#_spreading_method_arguments

          Roman Bober added a comment - - edited

          having same issue with spread operator  in my jenkins pipeline

          Is there any solution for this?

           

           

          org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
          WorkflowScript: 69: spread not yet supported for CPS transformation @ line 69, column 63.
          build_windows_project(*(build_wi
          ^

          1 error

          at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
          at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)
          at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
          at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
          at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
          at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
          at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
          at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
          at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
          at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:133)
          at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:126)
          at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:561)
          at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:522)
          at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:320)
          at hudson.model.ResourceController.execute(ResourceController.java:97)
          at hudson.model.Executor.run(Executor.java:429)
          Finished: FAILURE

          Roman Bober added a comment - - edited having same issue with spread operator  in my jenkins pipeline Is there any solution for this?     org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: WorkflowScript: 69: spread not yet supported for CPS transformation @ line 69, column 63. build_windows_project(*(build_wi ^ 1 error at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310) at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085) at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603) at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581) at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558) at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298) at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268) at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688) at groovy.lang.GroovyShell.parse(GroovyShell.java:700) at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:133) at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:126) at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:561) at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:522) at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:320) at hudson.model.ResourceController.execute(ResourceController.java:97) at hudson.model.Executor.run(Executor.java:429) Finished: FAILURE

          Jonas added a comment -

          I have created a PR to add support for spread list:

          def foo = [*x, 1, 2]
          

          spread map:

          def foo = [*:x, a: 'a']
          

          and spread in arguments

          sum(*args, 42)
          

          https://github.com/cloudbees/groovy-cps/pull/116

          Jonas added a comment - I have created a PR to add support for spread list: def foo = [*x, 1, 2] spread map: def foo = [*:x, a: 'a' ] and spread in arguments sum(*args, 42) https://github.com/cloudbees/groovy-cps/pull/116

          Devin Nusbaum added a comment -

          A fix for this issue has been released in Pipeline: Groovy plugin version 3536.vb_8a_6628079d5.

          Devin Nusbaum added a comment - A fix for this issue has been released in Pipeline: Groovy plugin version 3536.vb_8a_6628079d5 .

            dnusbaum Devin Nusbaum
            bkorren Barak Korren
            Votes:
            9 Vote for this issue
            Watchers:
            13 Start watching this issue

              Created:
              Updated:
              Resolved: