首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问Jenkins管道中的currentBuild.changeSets时引发NotSerializableException

访问Jenkins管道中的currentBuild.changeSets时引发NotSerializableException
EN

Stack Overflow用户
提问于 2019-07-23 05:36:24
回答 1查看 421关注 0票数 1

我是Jenkins Pipeline和groovy脚本的新手,所以请耐心等待。我正在尝试设置一个Jenkins管道,在这里我可以访问当前构建中修改过的(Git)文件。我使用以下代码行完成此操作:

代码语言:javascript
复制
   def changeLogSets = currentBuild.changeSets

如果当前构建中没有文件更改,这将很好地工作,但在其他情况下将抛出异常java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList。

如果我删除或注释掉"def changeLogSets = currentBuild.changeSets“行,则无论是否进行更改,构建都将成功

我在网上搜索了这个问题,但我发现如果我尝试访问currentBuild.rawBuild.changeSets而没有将其标记为@NonCPS,就会发生这种情况,但我在这里仅访问currentBuild.changeSets

我已经将我的Jenkinsfile文件剥离到最低限度,如下所示,并确认"def changeLogSets = currentBuild.changeSets“行是罪魁祸首。有人能告诉我我做错了什么吗?

代码语言:javascript
复制
@Library('EzeUtils')
pipeline {
    agent {label 'Windows'}

    stages {
        stage('Intial Setup')
        {            
            steps {
                echo "workspace directory: ${env.WORKSPACE}"
                echo bat(returnStdout:true,script:'set')
                script
                {
                    notify.notifyBitbucket('START','OMS',GIT_COMMIT)
                    gitList = gitInfo.getGitInfo()
                    GIT_COMMIT = gitList[0]
                    GIT_AUTHOR = gitList[1]
                    GIT_AUTHOR_EMAIL = gitList[2]
                    GIT_COMMIT_COMMENT = gitList[3]
                    GIT_BRANCH = "${env.GIT_BRANCH}"
                    echo "GIT_COMMIT:" + GIT_COMMIT
                    echo "GIT_AUTHOR:" + GIT_AUTHOR
                    echo "GIT_AUTHOR_EMAIL:" + GIT_AUTHOR_EMAIL
                    echo "GIT_COMMIT_COMMENT:" + GIT_COMMIT_COMMENT
                    echo "GIT_BRANCH:" + GIT_BRANCH
                    def version = "1.2.3." + env.BUILD_NUMBER
                    def changeLogSets = currentBuild.changeSets
                    // gitInfo.gitTag(version)

                    notify.notifyBitbucket('INPROGRESS','OMS',GIT_COMMIT)
                    utils.updateProductInfo(env.BUILD_NUMBER)
                    version = utils.readProductInfo()
                }
            }
        }
    }
    post
    {
        always
        {
            println "--------------------- Run always ---------------------"        
        }
        success
        {
            println ("SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}] author: ${GIT_AUTHOR_EMAIL} commit: ${GIT_COMMIT}' (${env.BUILD_URL}) ")
            script
            {
                notify.notifyBitbucket('SUCCESS','OMS',GIT_COMMIT)
            }
        }

        failure
        {
            println ("FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}] author: ${GIT_AUTHOR_EMAIL} commit: ${GIT_COMMIT} ${GIT_COMMIT_COMMENT}' (${env.BUILD_URL})")
            script
            {
                echo "Print::::::${GIT_AUTHOR_EMAIL}"
                notify.buildFailedEmail(GIT_AUTHOR_EMAIL)
                notify.notifyBitbucket('FAILED','OMS',GIT_COMMIT)
            }   
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-07-23 18:48:35

这对你有用吗?通常,要用@NonCPS覆盖某些内容,您需要将其封装在一个函数中。

代码语言:javascript
复制
import com.cloudbees.groovy.cps.NonCPS

@NonCPS
def myMethod() {
    return currentBuild.changeSets... //get what you need from change sets here
}

...

    def changeLogSets = myMethod()

你需要在NonCPS之外的Serializable对象上工作,这正是你的异常所说的java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList

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

https://stackoverflow.com/questions/57154064

复制
相关文章

相似问题

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