Jenkins Pipeline:java.io.NotSerializableException with XmlUtil.serialize

cnwbcb6i  于 5个月前  发布在  Jenkins
关注(0)|答案(1)|浏览(78)

我在Jenkins管道中遇到了一个问题,当使用XmlUtil.serialize时,我得到了java.io.NotSerializableException

验证码:

de updateFile() {
   def file = readFile(file: filePath)
   def xml = new XmlSlurper().parseText(file)

   ... update XML

   def modifiedXml = XmlUtil.serialize(xml)
   writeFile(file: filePath, text: modifiedXml)
}

pipeline {
    agent {
        label 'agent-1'
    }

    stages {
        stage('Update File') {
            steps {
                updateFile()
            }
        }
    }
}

字符串

错误信息

原因:java.io.NotSerializableException:groovy.util.slurpersupport.NodeChild
我在另一个服务器上运行这个作为一个Jenkins代理.我也尝试了@NonCPS,但它也不工作.所以任何人都可以帮助我解决这个问题?

h22fl7wq

h22fl7wq1#

根据https://www.jenkins.io/doc/book/pipeline/cps-method-mismatches/,您不能在@NonCPS-艾德方法中使用管道步骤--这可能是此解决方案失败的原因。
然而,我认为这个问题确实与CPS转换有关。你可以解决它,但是,甚至不使用@NonCPS。将XML相关的操作移动到一个单独的函数中就可以了。下面的操作确实很好:

import groovy.xml.XmlUtil

filePath = 'test.xml'

def updateFile2(file) {
    def xml = new XmlSlurper().parseText(file)

   //... update XML
   // e.g.
   // xml.bar = 'baz'

   def modifiedXml = XmlUtil.serialize(xml)
   return modifiedXml
}

def updateFile() {
    def file = readFile(file: filePath)
    def modifiedXml = updateFile2(file)
    writeFile(file: filePath, text: modifiedXml)
}

pipeline {
    agent {
        label 'agent-1'
    }
    stages {
        stage('Update File') {
            steps {
                updateFile()
            }
        }
    }
}

字符串
显然,当在同一个函数中混合管道步骤和XML方法时,CPS转换会失败;将调用放入不同的函数可以避免这个问题。

相关问题