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

Silent error : UnsupportedOperationExceptions are not raised when using each/find

      Currently, putting the following code in a Jenkinsfile will raise a UnsupportedOperationException: Calling public static java.util.List org.codehaus.groovy.runtime.DefaultGroovyMethods.find(java.util.List,groovy.lang.Closure) on a CPS-transformed closure is not yet supported (JENKINS-26481); encapsulate in a @NonCPS method, or use Java-style loops

      node {
          tmp = [ 'A', 'B' ].find { it == 'B' }
          echo tmp
      }
      

      However, if this code is used without @NonCPS in a shared library, it will fail silently and tmp will be false.

          [JENKINS-42024] Silent error : UnsupportedOperationExceptions are not raised when using each/find

          Lucas Cimon created issue -
          Lucas Cimon made changes -
          Description Original: Currently, putting the following code in a Jenkinsfile will raise a {{UnsupportedOperationException: Calling public static java.util.List org.codehaus.groovy.runtime.DefaultGroovyMethods.find(java.util.List,groovy.lang.Closure) on a CPS-transformed closure is not yet supported (JENKINS-26481); encapsulate in a @NonCPS method, or use Java-style loops}}
          {code}
          node {
              tmp = [ 'A', 'B' ].find { it == 'B' }
              echo tmp
          }
          {code}

          Howerver, if this code is used without {{@NonCPS}} in a shared library, it will fail silently and {{tmp}} will be {{false}}.
          New: Currently, putting the following code in a Jenkinsfile will raise a {{UnsupportedOperationException: Calling public static java.util.List org.codehaus.groovy.runtime.DefaultGroovyMethods.find(java.util.List,groovy.lang.Closure) on a CPS-transformed closure is not yet supported (JENKINS-26481); encapsulate in a @NonCPS method, or use Java-style loops}}
          {code}
          node {
              tmp = [ 'A', 'B' ].find { it == 'B' }
              echo tmp
          }
          {code}

          However, if this code is used without {{@NonCPS}} in a shared library, it will fail silently and {{tmp}} will be {{false}}.
          Jesse Glick made changes -
          Link New: This issue duplicates JENKINS-41189 [ JENKINS-41189 ]

          Jesse Glick added a comment -

          Such code is illegal, but the automatic detection of it is only straightforward in sandbox mode. (Nothing to do with libraries per se.)

          Jesse Glick added a comment - Such code is illegal, but the automatic detection of it is only straightforward in sandbox mode. (Nothing to do with libraries per se.)
          Jesse Glick made changes -
          Component/s New: workflow-cps-plugin [ 21713 ]
          Component/s Original: workflow-cps-global-lib-plugin [ 21714 ]
          Issue Type Original: Bug [ 1 ] New: Improvement [ 4 ]
          Jesse Glick made changes -
          Link New: This issue relates to JENKINS-26481 [ JENKINS-26481 ]
          Jesse Glick made changes -
          Labels New: diagnostics

          Lucas Cimon added a comment -

          OK. Thanks for your answer.

          I have some questions:

          • when and where is the sandbox mode "ON" ? Whenever a Jenkinsfile in executed ? Only when you "Replay" it ?
          • is it possible to detect this outside Jenkins, in a "static code analysis" phase, or maybe when running unit tests ?

          Lucas Cimon added a comment - OK. Thanks for your answer. I have some questions: when and where is the sandbox mode "ON" ? Whenever a Jenkinsfile in executed ? Only when you "Replay" it ? is it possible to detect this outside Jenkins, in a "static code analysis" phase, or maybe when running unit tests ?

          Jesse Glick added a comment -

          when and where is the sandbox mode "ON" ? Whenever a Jenkinsfile in executed ?

          For standalone Pipeline jobs with inline script, this is a configuration option. For jobs with a script loaded from SCM, currently it is always on (filed separately). For branch projects, it is always on. For folder-scoped libraries, it is on. For global libraries, it is off.

          is it possible to detect this outside Jenkins, in a "static code analysis" phase

          Afraid not.

          Jesse Glick added a comment - when and where is the sandbox mode "ON" ? Whenever a Jenkinsfile in executed ? For standalone Pipeline jobs with inline script, this is a configuration option. For jobs with a script loaded from SCM, currently it is always on (filed separately). For branch projects, it is always on. For folder-scoped libraries, it is on. For global libraries, it is off. is it possible to detect this outside Jenkins, in a "static code analysis" phase Afraid not.

          Lucas Cimon added a comment -

          Based on this doc: https://github.com/cloudbees/groovy-cps/blob/master/doc/sandbox.md
          it seems it could be possible to write an alternative groovy intepreter
          (maybe taking inspiration from this code: https://github.com/jenkinsci/workflow-cps-plugin/blob/master/src/main/java/org/jenkinsci/plugins/workflow/cps/CpsGroovyShellFactory.java)
          that would make it possible to exacute Groovy scripts on the CLI in the same manner as in Jenkins pipeline plugin.

          Does this plan sounds feasible to you ?

          Lucas Cimon added a comment - Based on this doc: https://github.com/cloudbees/groovy-cps/blob/master/doc/sandbox.md it seems it could be possible to write an alternative groovy intepreter (maybe taking inspiration from this code: https://github.com/jenkinsci/workflow-cps-plugin/blob/master/src/main/java/org/jenkinsci/plugins/workflow/cps/CpsGroovyShellFactory.java ) that would make it possible to exacute Groovy scripts on the CLI in the same manner as in Jenkins pipeline plugin. Does this plan sounds feasible to you ?

            Unassigned Unassigned
            lucasc Lucas Cimon
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: