当前位置: 首页 > 知识库问答 >
问题:

访问Jenkins管道中的当前Build.change集时引发的异常

缪风史
2023-03-14

我对詹金斯管道和时髦的剧本非常陌生,所以请耐心听我说。我试图设置一个詹金斯管道,在那里我可以访问当前构建中的修改(Git)文件。我使用以下代码行来完成此操作:

   def changeLogSets = currentBuild.changeSets

如果当前构建中没有文件更改,这将正常工作,但将抛出异常java.io.NotSeriazableExcture:hudson.plugins.git.GitChangeSetList否则。

如果我删除或注释掉“def ChangeLogSets=当前Build.change设置”这一行,无论有没有更改,构建都会成功

我在网上搜索了这个问题,但我发现如果我试图访问当前的Build.rawBuild.change集而没有标记它@NonCPS,但我只访问当前的Build.change集,就会发生这种情况

我已经将我的Jenkinsfile剥离到最低限度,如下所示,并确认“def ChangeLogSets=当前Build.change集”这行是罪魁祸首。谁能告诉我我做错了什么?

@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)
            }   
        }
    }
}

共有1个答案

锺离赤岩
2023-03-14

这对你有用吗?一般来说,要使用@NonCPS覆盖某些内容,需要将其封装在函数中。

import com.cloudbees.groovy.cps.NonCPS

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

...

    def changeLogSets = myMethod()

您需要在NonCPS之外的可序列化对象上工作,这正是您的异常所说的java.io.NotSerializableExcture:hudson.plugins.git.GitChangeSetList

 类似资料:
  • 我正在使用共享库在Jenkins中构建CI/CD管道。在我的例子中,一些阶段需要通过网络应用编程接口发送执行信息。在这种情况下,我们需要将当前阶段的阶段id添加到api调用中。 如何访问与${stage_NAME}类似的stage id?

  • 问题内容: 使用Jenkins 2.x中 的Pipeline插件,如何从一个步骤中访问在阶段或节点级别某个位置定义的Groovy变量? 简单的例子: 在Jenkins输出页面上给出以下内容: 可以看到,在该步骤中将打印一个空字符串。 解决方法是通过以下方式在环境范围内定义变量 并通过打印 但是,这种滥用会破坏此任务的环境范围。 问题答案: 要使用可模板化的字符串(将变量替换为字符串),请使用双引号

  • 问题内容: 确定Jenkins管道正在运行的当前OS的方式是什么? 上下文:我正在构建一个共享的Jenkins管道脚本,该脚本应在所有平台(Windows,OSX,Linux)上运行,并在每个平台上执行不同的操作。 我尝试了类似的东西: 但是即使它在Windows或Mac上运行,它也总是进入分支 我尝试了这样的快速管道。 每个节点都可以在具有正确操作系统的机器上正确运行,但是所有节点都可以打印 有

  • 我目前使用的是Build Flow插件,在Jenkins 2.0中,这个插件似乎已经被放弃,转而支持管道。 在使用新管道重建现有工作时遇到了一些问题。 目前,我有类似这样的代码: 此处的目标是并行运行多个现有作业,然后访问有关已完成的生成的信息。这在构建流插件中一直没有问题。 我无法找到使用新管道访问这些数据的方法。 join['Job1']的转储不会像构建流插件那样提供对抽象构建或类似内容的访问

  • 美好的一天, 我尝试在新的Jenkins实例上设置多分支管道,在扫描多分支管道日志中遇到了以下错误: 没有这样的文件:E:\Continuous Integration\Jenkins\jobs\Enhanced API\indexing\indexing.log 根据jenkins.err.log,我遇到了一个 这个Jenkins的版本是2.85,带有以下版本的Git插件: Git客户端插件-2

  • 我希望使用Kubernetes API,即使用方法,列出集群中存在的名称空间。 当我在Linux机器上运行下面提到的代码时,它工作得很好。 错误: 警告重试(重试(total=0,connect=none,read=none,redirect=none,status=none))在连接被“newconnectionerror”(“:未能建立新连接:[Errno 110]连接超时”,)“:/api/