在 Jenkins 管道中访问 currentBuild.changeSets 时抛出的 NotSerializable



我对 Jenkins Pipeline 和时髦的脚本很陌生,所以请耐心等待。我正在尝试设置一个 Jenkins 管道,我可以在其中访问当前版本中修改的 (Git) 文件。我使用以下代码行执行此操作:

def changeLogSets = currentBuild.changeSets

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

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

我在网上搜索这个问题,但我发现如果我尝试访问当前构建.rawBuild.changeSets而不将其标记为@NonCPS,就会发生这种情况,但我只在这里访问当前构建.changeSets

我已经将我的 Jenkinsfile 精简到最低限度,如下所示,并确认"def changeLogSets = currentBuild.changeSets 是罪魁祸首。谁能告诉我我做错了什么?

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

这对你有用吗?一般来说,要用@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.NotSerializableException: hudson.plugins.git.GitChangeSetList

最新更新