gpt4 book ai didi

git - Jenkins 管道抛出 java.io.NotSerializableException : org. jenkinsci.plugins.workflow.job.WorkflowRun 即使使用 @NonCPS

转载 作者:太空狗 更新时间:2023-10-29 13:58:03 25 4
gpt4 key购买 nike

代码相当简单,我只想要一个 rev-list 发布到 slack。但是导致我出现问题的部分是当我实际上试图从 git 获取 rev-list 时。

问题代码

@NonCPS
def getRevisionList(currentCommit, lastSuccessfulCommit) {
def commits = sh(
script: "git rev-list $currentCommit $lastSuccessfulCommit",
returnStdout: true
).split('\n')
echo "$commits"
}

完整代码:

pipeline {
environment {
failureMessage = ""
}

agent {
node {
label 'gsacsp-build02.reisys.com'
}
}
stages {
stage('Parse Commits') {
steps {
script {
def currentBuild = currentBuild.rawBuild
def currentCommit = commitHashForBuild(currentBuild)
def lastSuccessfulCommit = getLastSuccessfulCommit()

getRevisionList(currentCommit, lastSuccessfulCommit)
}
}
}
}
post {
always {
withCredentials([string(credentialsId: 'BOT_SLACK_HOOK', variable: 'BOT_SLACK_HOOK')]) {
script {
failureMessage = readFile "jenkinshelpers/slackfailuremessage.json"
sh "curl -X POST -H 'Content-type: application/json' --data '$failureMessage' $BOT_SLACK_HOOK"
}
}
}
}
}

//Groovy Helper Methods

@NonCPS
def getRevisionList(currentCommit, lastSuccessfulCommit) {
def commits = sh(
script: "git rev-list $currentCommit $lastSuccessfulCommit",
returnStdout: true
).split('\n')
echo "$commits"
}

@NonCPS
def getLastSuccessfulCommit() {
def lastSuccessfulHash = null
def lastSuccessfulBuild = currentBuild.rawBuild.getPreviousSuccessfulBuild()
if ( lastSuccessfulBuild ) {
lastSuccessfulHash = commitHashForBuild( lastSuccessfulBuild )
}
return lastSuccessfulHash
}

@NonCPS
def commitHashForBuild(build) {
def scmAction = build?.actions.find { action -> action instanceof jenkins.scm.api.SCMRevisionAction }
return scmAction?.revision?.hash
}

Jenkins 给我的错误是这样的:

an exception which occurred:
in field com.cloudbees.groovy.cps.impl.BlockScopeEnv.locals
in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@76bde0fe
in field com.cloudbees.groovy.cps.impl.CallEnv.caller
in object com.cloudbees.groovy.cps.impl.FunctionCallEnv@662f031a
in field com.cloudbees.groovy.cps.Continuable.e
in object org.jenkinsci.plugins.workflow.cps.SandboxContinuable@1156ea7f
in field org.jenkinsci.plugins.workflow.cps.CpsThread.program
in object org.jenkinsci.plugins.workflow.cps.CpsThread@5bada334
in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.threads
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@42bbb563
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@42bbb563

导致:java.io.NotSerializableException:org.jenkinsci.plugins.workflow.job.WorkflowRun

更多或更少我遵循以下内容,但是我收到了错误。我试过以原来的方式运行它,但我也没有任何运气。

Jenkinsfile - get all changes between builds

最佳答案

您看到的异常是由以下行引起的:

def currentBuild = currentBuild.rawBuild

currentBuild.rawBuild 返回一个不可序列化的对象,因此必须在 @NonCPS 方法中调用以避免出现此异常。尝试简化您的辅助方法,以便它们访问 @NonCPS 中的 currentBuild 变量:

@NonCPS
def getRevisionList(currentCommit, lastSuccessfulCommit) {
def commits = sh(
script: "git rev-list $currentCommit $lastSuccessfulCommit",
returnStdout: true
).split('\n')
echo "$commits"
}

@NonCPS
def getLastSuccessfulCommit() {
def lastSuccessfulHash = null
def lastSuccessfulBuild = currentBuild.rawBuild.getPreviousSuccessfulBuild()
if ( lastSuccessfulBuild ) {
lastSuccessfulHash = commitHashForBuild( lastSuccessfulBuild )
}
return lastSuccessfulHash
}

@NonCPS
def commitHashForBuild() {
def scmAction = currentBuild?.rawBuild?.actions?.find { action -> action instanceof jenkins.scm.api.SCMRevisionAction }
return scmAction?.revision?.hash
}

currentBuild.rawBuild - a hudson.model.Run with further APIs, only for trusted libraries or administrator-approved scripts outside the sandbox; the value will not be Serializable so you may only access it inside a method marked @NonCPS


Source: https://qa.nuxeo.org/jenkins/pipeline-syntax/globals#currentBuild

关于git - Jenkins 管道抛出 java.io.NotSerializableException : org. jenkinsci.plugins.workflow.job.WorkflowRun 即使使用 @NonCPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51637589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com