java.io.NotSerializableException: java.lang.UNIXProcess

585 views
Skip to first unread message

chencho m-a

unread,
Jun 8, 2020, 1:29:56 PM6/8/20
to Jenkins Users
Hi all, 

I have a (I hope) stupid issue that i am not able to solve

I am calling to a method that only call a bash script like this.


def exists(path) {
   try{
           sh(script:'ls -l',
           returnStdout: true).trim()
           return false
     } catch (err){ error "-E- Failed to run fs.exists(${path}), Exception err: ${err}"}
}



And I am always getting this exception

07:55:59  java.io.NotSerializableException: java.lang.UNIXProcess
[Pipeline] End of Pipeline
an exception which occurred:
       
in field groovy.lang.Closure.delegate
       
in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@5ac3f4cc
       
in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.closures
       
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@239d9620
       
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@239d9620
Caused: java.io.NotSerializableException: java.lang.UNIXProcess
        at org
.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:926)
        at org
.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
        at org
.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
        at org
.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50)
        at org
.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179)
        at java
.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344)
        at java
.util.LinkedHashMap.internalWriteEntries(LinkedHashMap.java:333)
        at java
.util.HashMap.writeObject(HashMap.java:1363)
        at sun
.reflect.GeneratedMethodAccessor24.invoke(Unknown Source)
        at sun
.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java
.lang.reflect.Method.invoke(Method.java:498)
...


Any clue?

Jenkins 2.222.4

Jérôme Godbout

unread,
Jun 8, 2020, 1:42:15 PM6/8/20
to jenkins...@googlegroups.com

Yet another case of @NonCPS, this serializable requirements for functions is such a terrible idea, talk about tentacular requirements that destroy standard calls. They should have put recovery point function, where the context would have been saved and the script could add them as it please, this would have prevent all this @NonCPS nightmare and lead to a more standard code with standard groovy.

 

Add @NonCPS decorator to your functions:

 

@NonCPS

def MyFct() {

   … do your stuff here

}

 

This prevent serialization of each actions into that functions.

--
You received this message because you are subscribed to the Google Groups "Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jenkinsci-use...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jenkinsci-users/1c647bd5-c779-427a-bf98-1a61b5074b65o%40googlegroups.com.

chencho m-a

unread,
Jun 8, 2020, 6:08:20 PM6/8/20
to Jenkins Users
I altready tried this, with this output.

expected to call Script4.exists but wound up catching sh; see: https://jenkins.io/redirect/pipeline-cps-method-mismatches/

NOTE: if I use execute().text, instead of sh, it works fine.

To unsubscribe from this group and stop receiving emails from it, send an email to jenkins...@googlegroups.com.

Slide

unread,
Jun 8, 2020, 6:58:27 PM6/8/20
to Jenkins User Mailing List
Can you share your Jenkinsfile? There may be some contextual information that would help people help you.

To unsubscribe from this group and stop receiving emails from it, send an email to jenkinsci-use...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jenkinsci-users/ffbb95d8-8fa2-4401-8a75-5480a10fce1do%40googlegroups.com.


--

Devin Nusbaum

unread,
Jun 9, 2020, 9:00:26 AM6/9/20
to Jenkins Users
The method named `exists` from the first email is fine and does not have any problems. Adding @NonCPS to it is incorrect as explained here and causes the “expected to call Script4.exists but wound up catching sh” warning.

You mentioned using Groovy’s `String.execute()` extension method, which I suspect is the real problem, because that method creates a `java.lang.Process`, which cannot be serialized, and ends up stored as a local variable in the Pipeline, which causes the original error you posted. The Pipeline is serialized after steps execute (when using the default MAX_SURVIVABILITY durability level), which is why you don’t see the error until after the `sh` step runs.

You should not call `String.execute` or other similar Java or Groovy methods related to processes inside of a Pipeline, you should always use the `sh` or `bat` steps. Methods related to `java.lang.Process` will always execute the process on the master (which is probably not the behavior you want), and they are not allowed in the sandbox by default because users can use those methods to trivially bypass all security on the Jenkins master.

chencho m-a

unread,
Jun 9, 2020, 9:14:52 AM6/9/20
to Jenkins Users
You are right. 

Adding a lot of println debug lines I have realized that the error it was not at the piece of code I have posted here but other .execute() which whose output was not being consumed and it was blocking the flow.

Thank you all for the tips.


El martes, 9 de junio de 2020, 15:00:26 (UTC+2), Devin Nusbaum escribió:
The method named `exists` from the first email is fine and does not have any problems. Adding @NonCPS to it is incorrect as explained here and causes the “expected to call Script4.exists but wound up catching sh” warning.

You mentioned using Groovy’s `String.execute()` extension method, which I suspect is the real problem, because that method creates a `java.lang.Process`, which cannot be serialized, and ends up stored as a local variable in the Pipeline, which causes the original error you posted. The Pipeline is serialized after steps execute (when using the default MAX_SURVIVABILITY durability level), which is why you don’t see the error until after the `sh` step runs.

You should not call `String.execute` or other similar Java or Groovy methods related to processes inside of a Pipeline, you should always use the `sh` or `bat` steps. Methods related to `java.lang.Process` will always execute the process on the master (which is probably not the behavior you want), and they are not allowed in the sandbox by default because users can use those methods to trivially bypass all security on the Jenkins master.


--

--
You received this message because you are subscribed to the Google Groups "Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jenkins...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages