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

pipeline groovy script - Sort a list with custom comparator or closure not sorting

    Details

    • Similar Issues:

      Description

       

      When using groovy script in the Pipeline Plugin, sorting a list using closure or a custom comparator does not work anymore.

       

      Steps to reproduce:

      1. create new item of type Pipeline
      2. In the Pipeline script add the following code
      #!groovy
      
      assert ["aa","bb","cc"] == ["aa","cc","bb"].sort { a, b -> a <=> b }
      1. Click Save
      2. Click Build Now
      3. Check the failed build:

      [Pipeline] End of Pipeline
      hudson.remoting.ProxyException: Assertion failed:

      assert ["aa","bb","cc"] == ["aa","cc","bb"].sort { a, b -> a <=> b }

      at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.java:404)
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed(ScriptBytecodeAdapter.java:650)
      at com.cloudbees.groovy.cps.impl.AssertBlock$ContinuationImpl.fail(AssertBlock.java:47)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      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.ConstantBlock.eval(ConstantBlock.java:21)
      at com.cloudbees.groovy.cps.Next.step(Next.java:83)
      at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:173)
      at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:162)
      at 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:162)
      at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:19)
      at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:35)
      at 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)
      at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174)
      at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:330)
      at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:82)
      at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:242)
      at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:230)
      at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
      at 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)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      at java.lang.Thread.run(Thread.java:748)
      Finished: FAILURE

      Expected result is a sorted list:

      [aa, bb, cc]

       

       

        Attachments

          Issue Links

            Activity

            Hide
            jglick Jesse Glick added a comment -

            Yup, DefaultGroovyMethods.sort overloads are not supported in CPS-transformed mode yet, sorry. You would need to wrap the sorting logic in a method marked @NonCPS.

            Show
            jglick Jesse Glick added a comment - Yup, DefaultGroovyMethods.sort overloads are not supported in CPS-transformed mode yet, sorry. You would need to wrap the sorting logic in a method marked @NonCPS .
            Hide
            persal79 Per Salomonsson added a comment - - edited

            Thanks! adding the annotation helped.

            I was also able to change some of the code back to .eachLine {..} as well. I'm pretty sure it worked up until our Jenkins was upgraded today.

            Show
            persal79 Per Salomonsson added a comment - - edited Thanks! adding the annotation helped. I was also able to change some of the code back to .eachLine {..} as well. I'm pretty sure it worked up until our Jenkins was upgraded today.
            Hide
            jglick Jesse Glick added a comment -

            If it did, it was by accident. See JENKINS-26481.

            Show
            jglick Jesse Glick added a comment - If it did, it was by accident. See  JENKINS-26481 .
            Hide
            jglick Jesse Glick added a comment -

            No, it is a defect—just one we do not have a convenient fix for yet. (If you are interested, the issue is that the sort methods require CPS translation of a utility class, and the existing Translator only handles method bodies so far.)

            Show
            jglick Jesse Glick added a comment - No, it is a defect—just one we do not have a convenient fix for yet. (If you are interested, the issue is that the sort methods require CPS translation of a utility class, and the existing Translator only handles method bodies so far.)
            Hide
            jenkey Claudio B added a comment -

            Hi,

            I also have had a similar issue. I am trying to use a shared global library and I have used different methods to sort a List of String's given as an argument, annotated with NonCPS or not there always was a problem:

            1. the list would not be sorted
            2. calling the `sort` method of the third party Library with the protoype List sort(SomeInterface[]) always returned a String instead of a List
            3. the method call from the pipeline script would silently fail and just return null

            I tried using Collections.sort directly with a custom Comparator, and also tried to extract the sorting logic into a private NonCPS method to no avail.

            Since I had to implement SomeInterface in a wrapper class to make use of the 3rd party Comparator the solution was to annotate any method of this class with {{NonCPS,}} too. Simply using an anonymous class inside a NonCPS annotated method was not good enough...

            All in all I needed 90 iterations until I found the problem... for a simple sorting call! Hope this helps someone else too. Just my 2¢.

            Show
            jenkey Claudio B added a comment - Hi, I also have  had a similar issue. I am trying to use a shared global library and I have used different methods to sort a List of String's given as an argument, annotated with NonCPS or not there always was a problem: the list would not be sorted calling the `sort` method of the third party Library with the protoype List sort(SomeInterface[]) always returned a String instead of a List the method call from the pipeline script would silently fail and just return null I tried using Collections.sort directly with a custom Comparator , and also tried to extract the sorting logic into a private NonCPS method to no avail. Since I had to implement SomeInterface in a wrapper class  to make use of the 3rd party Comparator the solution was to annotate any method of this class with {{ NonCPS ,}} too. Simply using an anonymous class inside a NonCPS annotated method was not good enough... All in all I needed 90 iterations until I found the problem... for a simple sorting call! Hope this helps someone else too. Just my 2¢.
            Hide
            jglick Jesse Glick added a comment -

            @NonCPS should work fine. Just be sure that you are not attempting to call CPS-transformed code from inside the closure!

            Show
            jglick Jesse Glick added a comment - @NonCPS should work fine. Just be sure that you are not attempting to call CPS-transformed code from inside the closure!
            Hide
            fabricepipart Fabrice Pipart added a comment -

            I also had the same issue and spent hours to find out where the problem came from. Thanks a lot Claudio B for highlighting that @NonCPS must be present on all methods that might get called during the sort!

            In my case the stack trace was definitely not self explanatory :

            hudson.remoting.ProxyException: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '-1' with class 'java.lang.Integer' to class 'java.util.List'
            	at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:405)
            	at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:319)
            	at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnCollection(DefaultTypeTransformation.java:267)
            	at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:219)
            	at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:603)
            	at Unknown.Unknown(Unknown)
            Show
            fabricepipart Fabrice Pipart added a comment - I also had the same issue and spent hours to find out where the problem came from. Thanks a lot Claudio B for highlighting that @NonCPS must be present on all methods that might get called during the sort! In my case the stack trace was definitely not self explanatory : hudson.remoting.ProxyException: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '-1' with class 'java.lang. Integer ' to class 'java.util.List' at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:405) at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:319) at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnCollection(DefaultTypeTransformation.java:267) at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:219) at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:603) at Unknown.Unknown(Unknown)
            Hide
            jglick Jesse Glick added a comment -

            I have no idea what that cast exception refers to offhand.

            Show
            jglick Jesse Glick added a comment - I have no idea what that cast exception refers to offhand.
            Hide
            tsvi Tsvi Mostovicz added a comment - - edited

            Fabrice Pipart I've been having the same casting issues. @NonCPS annotation fixed the issue. Thanks.

             

            Show
            tsvi Tsvi Mostovicz added a comment - - edited Fabrice Pipart I've been having the same casting issues. @NonCPS annotation fixed the issue. Thanks.  
            Hide
            fabricepipart Fabrice Pipart added a comment -

            Great news  I am happy it helped!

            Show
            fabricepipart Fabrice Pipart added a comment - Great news  I am happy it helped!
            Hide
            quas Jakub Pawlinski added a comment -

            Just lost two hours thinking that I'm doing something wrong.

            the org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: unclassified field java.lang.Integer Name is ** anything but helpful.

            tried all possible sorts with closure, with comparator, with OrderBy, finally falled back to Script Console to learn that each attempt I made works fine.

            Decided to submit a bug, but found its already here.

            Would love to have proper "@NonCPS" requirement messages/exceptions or even a list to refer to rather than integer error. 

            Show
            quas Jakub Pawlinski added a comment - Just lost two hours thinking that I'm doing something wrong. the  org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: unclassified field java.lang.Integer Name is ** anything but helpful. tried all possible sorts with closure, with comparator, with OrderBy, finally falled back to Script Console to learn that each attempt I made works fine. Decided to submit a bug, but found its already here. Would love to have proper " @NonCPS" requirement messages/exceptions or even a list to refer to rather than integer error.  
            Hide
            scm_issue_link SCM/JIRA link daemon added a comment -

            Code changed in jenkins
            User: Andrew Bayer
            Path:
            src/main/resources/org/jenkinsci/plugins/scriptsecurity/sandbox/whitelists/generic-whitelist
            http://jenkins-ci.org/commit/script-security-plugin/15c8d24fc2e46b705d461b72f0d9908ed7530c68
            Log:
            JENKINS-44924 Whitelist DefaultGroovyMethods for sort, unique, etc

            Show
            scm_issue_link SCM/JIRA link daemon added a comment - Code changed in jenkins User: Andrew Bayer Path: src/main/resources/org/jenkinsci/plugins/scriptsecurity/sandbox/whitelists/generic-whitelist http://jenkins-ci.org/commit/script-security-plugin/15c8d24fc2e46b705d461b72f0d9908ed7530c68 Log: JENKINS-44924 Whitelist DefaultGroovyMethods for sort, unique, etc
            Hide
            scm_issue_link SCM/JIRA link daemon added a comment -

            Code changed in jenkins
            User: Andrew Bayer
            Path:
            src/main/resources/org/jenkinsci/plugins/scriptsecurity/sandbox/whitelists/generic-whitelist
            http://jenkins-ci.org/commit/script-security-plugin/ffbfc0adda6af7c787c0569bc2196d2343c3a259
            Log:
            Merge pull request #191 from abayer/add-more-dgm-methods

            JENKINS-44924 Whitelist DefaultGroovyMethods for sort, unique, etc

            Compare: https://github.com/jenkinsci/script-security-plugin/compare/47d7d1a2df7a...ffbfc0adda6a

            Show
            scm_issue_link SCM/JIRA link daemon added a comment - Code changed in jenkins User: Andrew Bayer Path: src/main/resources/org/jenkinsci/plugins/scriptsecurity/sandbox/whitelists/generic-whitelist http://jenkins-ci.org/commit/script-security-plugin/ffbfc0adda6af7c787c0569bc2196d2343c3a259 Log: Merge pull request #191 from abayer/add-more-dgm-methods JENKINS-44924 Whitelist DefaultGroovyMethods for sort, unique, etc Compare: https://github.com/jenkinsci/script-security-plugin/compare/47d7d1a2df7a...ffbfc0adda6a
            Hide
            scof Roman Sinyakov added a comment - - edited

            Andrew Bayer Is there any plans to close the issue? And wonder why is it considered a "Minor"?? The trivial correct groovy code just doesn't (silently!) work and that's a "small problem"?? Amazing...

            Show
            scof Roman Sinyakov added a comment - - edited Andrew Bayer Is there any plans to close the issue? And wonder why is it considered a "Minor"?? The trivial correct groovy code just doesn't (silently!) work and that's a "small problem"?? Amazing...
            Hide
            issac1993 Daniel Issac added a comment -

            Any updates on this.?I agree with Roman Sinyakov.This seems to be a serious issue which needs to be fixed.

            Show
            issac1993 Daniel Issac added a comment - Any updates on this.?I agree with Roman Sinyakov.This seems to be a serious issue which needs to be fixed.
            Hide
            joerg_baeuerle Joerg Baeuerle added a comment - - edited

            Yes, I also agree. This has to be fixed. I've just spent two days of my life trying to figure out what was wrong with my pipeline script. My Groovy code worked perfectly in Jenkin's Script Console, but once put in a Jenkinsfile strange things happened. In my case it was not sort() but toSorted() which has the same problem, e.g. with the following code snippet

            def foo = ["hello","hi","hey"].toSorted { a, b -> a.length() <=> b.length() }
            println foo.toString()
            

            taken straight from the toSorted() specification in the Groovy Docs.

            In Jenkin's Script Console the output was

            [hi, hey, hello]
            

            which is correct. When run from a Jenkinsfile the build's output, however, was

            -1
            

             This is not acceptable and certainly not a "Minor" issue, because it costs a lot of time and money to hunt down these kinds of bugs!

            Show
            joerg_baeuerle Joerg Baeuerle added a comment - - edited Yes, I also agree. This has to be fixed. I've just spent two days of my life trying to figure out what was wrong with my pipeline script. My Groovy code worked perfectly in Jenkin's Script Console, but once put in a Jenkinsfile strange things happened. In my case it was not sort() but toSorted() which has the same problem, e.g. with the following code snippet def foo = [ "hello" , "hi" , "hey" ].toSorted { a, b -> a.length() <=> b.length() } println foo.toString() taken straight from the toSorted() specification in the Groovy Docs . In Jenkin's Script Console the output was [hi, hey, hello] which is correct. When run from a Jenkinsfile the build's output, however, was -1  This is not acceptable and certainly not a "Minor" issue, because it costs a lot of time and money to hunt down these kinds of bugs!
            Hide
            intrepidpat Pat Butkiewicz added a comment - - edited

            Just want to make sure I'm understanding this correctly. Jenkins has broken custom sorting in the Groovy language, expects people to write their Jenkinsfiles and Pipeline libraries in Groovy, and then marks this as a minor issue? Everyone on this thread agrees that's unacceptable, yes?

            Show
            intrepidpat Pat Butkiewicz added a comment - - edited Just want to make sure I'm understanding this correctly. Jenkins has broken custom sorting in the Groovy language, expects people to write their Jenkinsfiles and Pipeline libraries in Groovy, and then marks this as a minor issue? Everyone on this thread agrees that's unacceptable, yes?
            Hide
            abayer Andrew Bayer added a comment -

            If I could have viably fixed this, I would have already - the transformation done to Groovy code to be able to be durable makes a lot of things more or less impossible to get working correctly. We've dealt with as many of them as we could without having to basically write our own implementation of all of Groovy, but there are still edge cases (sorry, but this is a comparative edge case) where we just can't fix them. We're sorry, but this is what it is.

            Show
            abayer Andrew Bayer added a comment - If I could have viably fixed this, I would have already - the transformation done to Groovy code to be able to be durable makes a lot of things more or less impossible to get working correctly. We've dealt with as many of them as we could without having to basically write our own implementation of all of Groovy, but there are still edge cases (sorry, but this is a comparative edge case) where we just can't fix them. We're sorry, but this is what it is.
            Hide
            nealmac01 Neal Macdonald added a comment - - edited

            I couldn't get a pipeline script to work with map sort() at all until I came across this

            https://stackoverflow.com/questions/52946282/jenkins-sort-method-behaviour-not-as-expected. This might be a workaround for the issue above.

            Calling sort from a function with @NonCPS annotation eg:

            @NonCPS
            def sortExample(items) 
            {
                def itemsSorted = items.sort{ it['val'] }
                println(itemsSorted) 
            }
            
            node('targetnode')
            {
                def m = [ [name: 'abc', val: '123'], [name: 'zwe', val: '934'], [name: 'wxc', val: '789']]
                println m
                sortExample(m)
            }
            

            resulted in a full map sort dependent on the value of a specific key:

            [Pipeline] echo
            [{name=abc, val=123}, {name=zwe, val=934}, {name=wxc, val=789}]
            [Pipeline] echo
            [{name=abc, val=123}, {name=wxc, val=789}, {name=zwe, val=934}]
            
            Show
            nealmac01 Neal Macdonald added a comment - - edited I couldn't get a pipeline script to work with map sort() at all until I came across this https://stackoverflow.com/questions/52946282/jenkins-sort-method-behaviour-not-as-expected . This might be a workaround for the issue above. Calling sort from a function with @NonCPS annotation eg: @NonCPS def sortExample(items) { def itemsSorted = items.sort{ it['val'] } println(itemsSorted) } node('targetnode') { def m = [ [name: 'abc', val: '123'], [name: 'zwe', val: '934'], [name: 'wxc', val: '789']] println m sortExample(m) } resulted in a full map sort dependent on the value of a specific key: [Pipeline] echo [{name=abc, val=123}, {name=zwe, val=934}, {name=wxc, val=789}] [Pipeline] echo [{name=abc, val=123}, {name=wxc, val=789}, {name=zwe, val=934}]
            Hide
            lucasc Lucas Cimon added a comment - - edited

            I found bit of helpful context about this issue : https://wiki.jenkins.io/display/JENKINS/Pipeline+CPS+method+mismatches#PipelineCPSmethodmismatches-Callingnon-CPS-transformedmethodswithCPS-transformedarguments

            Edit: captain obvious... I did not notice the link to this exact issue on the wiki

            Here is the workaround I used to sort a list of Map objects, based on a String field:

            pipeline {
                stages {
                    stage("Test") {
                        steps {
                            script {
                                def propList = [[name: 'B'], [name: 'A']]
                                sortByField(propList, 'name')
                                propList.eachWithIndex { entry, i ->
                                    println "${i}: ${entry}"
                                }
                            }
                        }
                    }
                }
            }
            @NonCPS
            static sortByField(list, fieldName) {
                list.sort{ it[fieldName] }
            }
             
            Show
            lucasc Lucas Cimon added a comment - - edited I found bit of helpful context about this issue : https://wiki.jenkins.io/display/JENKINS/Pipeline+CPS+method+mismatches#PipelineCPSmethodmismatches-Callingnon-CPS-transformedmethodswithCPS-transformedarguments Edit: captain obvious... I did not notice the link to this exact issue on the wiki Here is the workaround I used to sort a list of Map objects, based on a String field: pipeline { stages { stage( "Test" ) { steps { script { def propList = [[name: 'B' ], [name: 'A' ]] sortByField(propList, 'name' ) propList.eachWithIndex { entry, i -> println "${i}: ${entry}" } } } } } } @NonCPS static sortByField(list, fieldName) { list.sort{ it[fieldName] } }
            Hide
            ianfixes Ian Katz added a comment -

            If I could have viably fixed this, I would have already - the transformation done to Groovy code to be able to be durable makes a lot of things more or less impossible to get working correctly. We've dealt with as many of them as we could without having to basically write our own implementation of all of Groovy, but there are still edge cases (sorry, but this is a comparative edge case) where we just can't fix them.

            If the sort function can't work under any circumstances, shouldn't the correct behavior be to have it throw some exception rather than just pretend to work?  (Emphasis for meaning, not for tone.)

            I lost about a day's work here trying permutations of the following documented descriptions of array sort:

            I would have greatly preferred an exception that said "We're sorry, but this is what it is."  Instead I assumed that I wasn't supplying the correct arguments, mutating instead of returning a value, etc.  That was a very unpleasant rabbit hole.

            Can you talk more about what makes function impossible to support?  For example, is it related to a threaded library or some other implementation detail that prevents the built-in function from every being translated to CPS?  Is it a lack of support for the "spaceship operator"?  Or is it something inherent to the sort algorithm that would make it fail even if I tried to implement my own array sort function by hand?

            Show
            ianfixes Ian Katz added a comment - If I could have viably fixed this, I would have already - the transformation done to Groovy code to be able to be durable makes a lot of things more or less impossible to get working correctly. We've dealt with as many of them as we could without having to basically write our own implementation of all of Groovy, but there are still edge cases (sorry, but this is a comparative edge case) where we just can't fix them. If the sort function can't work under any circumstances, shouldn't the correct behavior be to have it throw some exception rather than just pretend to work?  (Emphasis for meaning, not for tone.) I lost about a day's work here trying permutations of the following documented descriptions of array sort: http://docs.groovy-lang.org/next/html/documentation/working-with-collections.html#_sorting https://mrhaki.blogspot.com/2015/03/groovy-goodness-new-methods-to-sort-and.html https://mrhaki.blogspot.com/2011/09/groovy-goodness-sort-or-remove.html https://stackoverflow.com/a/20386474/2063546 I would have greatly preferred an exception that said "We're sorry, but this is what it is."  Instead I assumed that I wasn't supplying the correct arguments, mutating instead of returning a value, etc.  That was a very unpleasant rabbit hole. Can you talk more about what makes function impossible to support?  For example, is it related to a threaded library or some other implementation detail that prevents the built-in function from every being translated to CPS?  Is it a lack of support for the "spaceship operator"?  Or is it something inherent to the sort algorithm that would make it fail even if I tried to implement my own array sort function by hand?
            Hide
            jglick Jesse Glick added a comment -

            If you are using a reasonably recent version of workflow-cps it should have printed a warning with a link to a wiki page explaining this class of issue and workarounds.

            Show
            jglick Jesse Glick added a comment - If you are using a reasonably recent version of workflow-cps it should have printed a warning with a link to a wiki page explaining this class of issue and workarounds.
            Hide
            ianfixes Ian Katz added a comment -

            I'm on 2.190.2 of Jenkins, with BlueOcean 1.21.0. Not sure how to find workflow-cps version.

            I didn't see a warning, but my point is that it should produce an error, not a warning. What is the justification for allowing me to call a function that you know in advance will not do its job?

            Show
            ianfixes Ian Katz added a comment - I'm on 2.190.2 of Jenkins, with BlueOcean 1.21.0. Not sure how to find workflow-cps version. I didn't see a warning, but my point is that it should produce an error, not a warning. What is the justification for allowing me to call a function that you know in advance will not do its job?
            Hide
            jglick Jesse Glick added a comment -

            /pluginManager/installed; text console log in classic view, not Blue Ocean; and because the detector has false positives (it is very complicated).

            Show
            jglick Jesse Glick added a comment - /pluginManager/installed ; text console log in classic view, not Blue Ocean; and because the detector has false positives (it is very complicated).

              People

              • Assignee:
                Unassigned
                Reporter:
                persal79 Per Salomonsson
              • Votes:
                28 Vote for this issue
                Watchers:
                42 Start watching this issue

                Dates

                • Created:
                  Updated: