首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行shell时,Jenkins管道"java.io.NotSerializableException: hudson.model.User“

在执行shell时,Jenkins管道"java.io.NotSerializableException: hudson.model.User“
EN

Stack Overflow用户
提问于 2018-04-26 18:50:27
回答 2查看 4.4K关注 0票数 2

这是我的管道代码。注意,函数promoteBuild()是假的,它需要执行shell块。在这里,我只是让它回响一个常量字符串。

代码语言:javascript
复制
   pipeline {
    agent none

    stages {
        stage("PromoteBuild") {
            agent {
                label "test_agent"
            }
            steps {

                script {

                    mopName = "mop name"
                    try {

                        // Timeout in case to avoid running this forever
                        timeout(time: 30, unit: 'SECONDS') {
                            promoteMap = input id: 'promote', message: 'Choose bundled buildNumbers', ok: 'Promote?',
                                    parameters: [

                                            string(
                                                    defaultValue: mopName,
                                                    description: '',
                                                    name: 'MopName'),

                                    ],
                                    submitter: "xxxx", submitterParameter: 'approver'
                        }
                      promoteBuild()

                    } catch (err) {
                        def user = err.getCauses()[0].getUser()
                        if ('SYSTEM' == user.toString()) { // SYSTEM means timeout.
                            //No response means the build is launched by timer, promote the first bundled-number
                            echo "Promote only. No following deployment"
                            promoteBuild()
                            currentBuild.result = 'SUCCESS'
                        } else {
                            //if user aborted this operation, do nothing and mark the build as aborted
                            currentBuild.result = 'ABORTED'

                            echo "This build was aborted by [${user}]"
                        }

                    }

                }
            }
        }
    }

def promoteBuild() {
sh """
    echo "hello"
  """
}

函数promoteBuildtry块中成功工作(当我响应输入请求时),但在catch块(超时时)失败。

下面是控制台输出:

代码语言:javascript
复制
Input requested
Cancelling nested steps due to timeout
[Pipeline] }
[Pipeline] // timeout
[Pipeline] echo
Promote only. No following deployment
[Pipeline] sh
[testTmp] Running shell script
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
***java.io.NotSerializableException: hudson.model.User***
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
    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.HashMap.internalWriteEntries(HashMap.java:1777)
    at java.util.HashMap.writeObject(HashMap.java:1354)
    at sun.reflect.GeneratedMethodAccessor35.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    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.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    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.doWriteSerializableObject(RiverMarshaller.java:967)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    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.doWriteSerializableObject(RiverMarshaller.java:967)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    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.doWriteSerializableObject(RiverMarshaller.java:967)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    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.doWriteSerializableObject(RiverMarshaller.java:967)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    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.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)
    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.TreeMap.writeObject(TreeMap.java:2434)
    at sun.reflect.GeneratedMethodAccessor421.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976)

我确信它与"User“无关,因为如果删除shell调用,构建就成功了。有什么暗示吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-26 19:18:10

请参阅https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md#user-content-serializing-local-variables

因此:程序中使用的任何变量值都应该是数字、字符串或其他可序列化的类型。

您的问题在这一行:def user = err.getCauses()[0].getUser()

返回的对象类型为hudson.model.User,即不可串行化,即不实现Serializable接口。

由于您只对用户名感兴趣,所以可以这样做:

代码语言:javascript
复制
def user = err.getCauses()[0].getUser().toString()
if ('SYSTEM' == user) {

这将工作,因为字符串是可序列化的。

您可能还想找出异常发生的真正原因--尝试在catch块中记录它。

票数 8
EN

Stack Overflow用户

发布于 2021-05-01 20:04:32

@Vasan的答案是正确的解决方案。当您不添加promoteBuild()行或删除shell调用时,我只想说明为什么行为是不同的。正如文档所指出的,

由于管道必须通过Jenkins重新启动,运行程序的状态定期保存到磁盘,以便以后可以恢复(保存发生在每一步之后或在步骤的中间,例如sh)。

您可以看到,使用sh调用的步骤将触发要保存的管道状态,从而触发序列化操作,从而导致抛出java.io.NotSerializableException。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50050076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档