Ошибка с набором изменений в конвейере jenkins (Ошибка: java.io.NotSerializableException: hudson.plugins.git.GitChangeSetList)

#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}"
            }
        }
    }
}