I'm trying to move duplicated methods in several pipeline scripts to a 
shared library.  My first attempt, moving an enum type, worked fine.  My 
next test is moving a method annotated with "@NonCPS".  I noticed in the 
doc about writing shared libraries 
(https://jenkins.io/doc/book/pipeline/shared-libraries/), it had the 
following statement:

The Groovy source files in these directories get the same “CPS 
> transformation” as in Scripted Pipeline.


I have no idea what that means, but I suppose it might have some relevant 
to my problem.

The method I'm trying to move is simply this:
@NonCPS
def computeCauseData() {
    def result    = ""
    def causeActions = currentBuild.rawBuild.getAction(hudson.model.
CauseAction)
    for (action in causeActions) {
        println "action[${action}] displayName[${action.displayName}]"
        for (cause in action.causes) {
            println "cause[${cause}] 
shortDescription[${cause.shortDescription}]"
            result    = "${cause.shortDescription}."
            if (cause instanceof Cause.LegacyCodeCause) {
            }
            else if (cause instanceof TimerTrigger.TimerTriggerCause) {
            }
            else if (cause instanceof Cause.RemoteCause) {
                Cause.RemoteCause    remoteCause    = (Cause.RemoteCause) 
cause
                result    = "${cause.shortDescription}: 
Addr[${remoteCause.addr}] Note[${remoteCause.note}]."
            }
            else if (cause instanceof Cause.UserIdCause) {
            }
            else if (cause instanceof SCMTrigger.SCMTriggerCause) {
                SCMTrigger.SCMTriggerCause    scmTriggerCause    = (
SCMTrigger.SCMTriggerCause) cause
                println "scmTriggerCause[${scmTriggerCause}]"
            }
            else if (cause instanceof GitStatus.CommitHookCause) {
                GitStatus.CommitHookCause    commitHookCause    = (GitStatus
.CommitHookCause) cause
                String    sha1    = commitHookCause.sha1
                println "sha1[${sha1}]"
            }
            else {
    
            }
        }
    }
    
    return result
}

This works fine in the pipeline script. When I moved it to my shared 
library (in "vars/computeCauseData.groovy") and commented out the 
definition in the pipeline script, and then ran my test, I got the 
following:

java.io.NotSerializableException: org.codehaus.groovy.control.ErrorCollector
        at 
org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
        at 
org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
        at 
org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
        at 
org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
        at 
org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
        at 
org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)


In the past, I've avoid serialization errors by nulling out variables 
before they cross a scope. I tried modifying this method, simply nulling 
out everything but "result" right after their last use, and that made no 
difference.  Same error.


-- 
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-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-users/4127571d-0b9a-4d70-85af-a67bf1881a7b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to