#git #jenkins #jenkins-pipeline #changeset
#git #дженкинс #дженкинс-конвейер #набор изменений
Вопрос:
У меня такая ошибка:
java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList
когда ChangeSet!=null
, но странно, что ошибка возникла при обновлении этого плагина: конвейерные общие библиотеки Groovy, прежде чем это сработает хорошо, я использую jenkins v 2.21 и конвейер 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
Ответ №1:
Задания 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}"
}
}
}
}
Комментарии:
1. Похоже, это не помогает, если showChangeLogs находится внутри библиотеки, которая импортируется в Jenkinsfile
2. @gerasalus Я столкнулся с этой проблемой в общей библиотеке… Вы нашли решение для этого?
3. Привет @MarcellodeSales, я только что столкнулся с той же проблемой, но использовал аннотацию @NonCPS до того, как метод в моих разделяемых библиотеках разрешил исключение.
4. @SimoneMarcato да, это тоже решило наши проблемы! Спасибо!
5. далее читайте здесь: github.com/jenkinsci/pipeline-plugin/blob/master /…
Ответ №2:
Не совсем тот же код, но та же проблема может быть вызвана, если вы не объявляете локальные переменные перед их использованием. https://blog.csdn.net/liurizhou/article/details/88236397
Итак, в дополнение к добавлению «@NonCPS» вам необходимо добавить «def» перед всеми локальными переменными
Ответ №3:
Я хочу предоставить другой ответ, связанный с ответом BMitch. rawBuild
метод создает проблему безопасности и блокируется в файле Jenkins. В более новых версиях 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}"
}
}
}
}