Error with changeSet in jenkins pipeline (Error:java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList)
Error with changeSet in jenkins pipeline (Error:java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList)
我有这个错误:
java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList
when ChangeSet!=null
但奇怪的是更新这个插件时出现了错误:Pipeline Shared Groovy Libraries,在这个工作正常之前,我使用jenkins v 2.21和pipeline 2.4,我的代码是下一个:
def changeLogSets = currentBuild.rawBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
def entries = changeLogSets[i].items
for (int j = 0; j < entries.length; j++) {
def entry = entries[j]
echo "${entry.commitId} by ${entry.author} on ${new Date(entry.timestamp)}: ${entry.msg}"
def files = new ArrayList(entry.affectedFiles)
for (int k = 0; k < files.size(); k++) {
def file = files[k]
echo " ${file.editType.name} ${file.path}"
}
}
}
changeLogSets= null
Jenkins 作业可以在执行过程中保存,这需要将它们序列化。 rawBuild 的内容不能被序列化,所以如果你访问它,你需要在一个以 @NonCPS
开头的函数中这样做。例如:
showChangeLogs()
@NonCPS
def showChangeLogs() {
def changeLogSets = currentBuild.rawBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
def entries = changeLogSets[i].items
for (int j = 0; j < entries.length; j++) {
def entry = entries[j]
echo "${entry.commitId} by ${entry.author} on ${new Date(entry.timestamp)}: ${entry.msg}"
def files = new ArrayList(entry.affectedFiles)
for (int k = 0; k < files.size(); k++) {
def file = files[k]
echo " ${file.editType.name} ${file.path}"
}
}
}
}
我想提供另一个答案,借用BMitch的答案。 rawBuild
方法存在安全问题并在 Jenkinsfile 中被阻止。在较新的版本中 currentBuild
对象直接暴露 changeSets
,所以你可以像这样使用脚本
@NonCPS
def showChangeLogs() {
def changeLogSets = currentBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
def entries = changeLogSets[i].items
for (int j = 0; j < entries.length; j++) {
def entry = entries[j]
echo "${entry.commitId} by ${entry.author} on ${new Date(entry.timestamp)}: ${entry.msg}"
def files = new ArrayList(entry.affectedFiles)
for (int k = 0; k < files.size(); k++) {
def file = files[k]
echo "${file.editType.name} ${file.path}"
}
}
}
}
不完全相同的代码,但如果您在使用局部变量之前不声明它们,也会导致同样的问题。
https://blog.csdn.net/liurizhou/article/details/88236397
因此,除了添加“@NonCPS”之外,您还需要在所有局部变量前添加'def'
我有这个错误:
java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList
when ChangeSet!=null
但奇怪的是更新这个插件时出现了错误:Pipeline Shared Groovy Libraries,在这个工作正常之前,我使用jenkins v 2.21和pipeline 2.4,我的代码是下一个:
def changeLogSets = currentBuild.rawBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
def entries = changeLogSets[i].items
for (int j = 0; j < entries.length; j++) {
def entry = entries[j]
echo "${entry.commitId} by ${entry.author} on ${new Date(entry.timestamp)}: ${entry.msg}"
def files = new ArrayList(entry.affectedFiles)
for (int k = 0; k < files.size(); k++) {
def file = files[k]
echo " ${file.editType.name} ${file.path}"
}
}
}
changeLogSets= null
Jenkins 作业可以在执行过程中保存,这需要将它们序列化。 rawBuild 的内容不能被序列化,所以如果你访问它,你需要在一个以 @NonCPS
开头的函数中这样做。例如:
showChangeLogs()
@NonCPS
def showChangeLogs() {
def changeLogSets = currentBuild.rawBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
def entries = changeLogSets[i].items
for (int j = 0; j < entries.length; j++) {
def entry = entries[j]
echo "${entry.commitId} by ${entry.author} on ${new Date(entry.timestamp)}: ${entry.msg}"
def files = new ArrayList(entry.affectedFiles)
for (int k = 0; k < files.size(); k++) {
def file = files[k]
echo " ${file.editType.name} ${file.path}"
}
}
}
}
我想提供另一个答案,借用BMitch的答案。 rawBuild
方法存在安全问题并在 Jenkinsfile 中被阻止。在较新的版本中 currentBuild
对象直接暴露 changeSets
,所以你可以像这样使用脚本
@NonCPS
def showChangeLogs() {
def changeLogSets = currentBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
def entries = changeLogSets[i].items
for (int j = 0; j < entries.length; j++) {
def entry = entries[j]
echo "${entry.commitId} by ${entry.author} on ${new Date(entry.timestamp)}: ${entry.msg}"
def files = new ArrayList(entry.affectedFiles)
for (int k = 0; k < files.size(); k++) {
def file = files[k]
echo "${file.editType.name} ${file.path}"
}
}
}
}
不完全相同的代码,但如果您在使用局部变量之前不声明它们,也会导致同样的问题。 https://blog.csdn.net/liurizhou/article/details/88236397
因此,除了添加“@NonCPS”之外,您还需要在所有局部变量前添加'def'