Saltar al contenido

Error de java.util.regex.Matcher de la tubería de Jenkins java.io.NotSerializableException incluso con @NonCPS

Solución:

Probablemente debido a la m Alcance variable. Intenta restringirlo con def como esto:

def m = (logLine =~ TEST_LOGLINE_END_REGEX)

Sin def se crea una variable en un enlace de secuencia de comandos global y, por lo tanto, todavía existe después de salir del método.

Jenkins requiere que todas las variables sean serializables porque el estado de la canalización se guarda periódicamente en el disco en caso de interrupciones como el reinicio de un servidor. Esta función permite que las canalizaciones mantengan su estado y continúen incluso después de reiniciar el servidor. Las variables de tipo Matcher no se pueden serializar y requieren algún trabajo adicional por parte del desarrollador.

Desde jenkinsci / pipeline-plugin serializando variables locales:

Sin embargo, el enfoque más seguro es aislar el uso del estado no serializable dentro de un método marcado con la anotación @NonCPS. Dicho método será tratado como “nativo” por el motor Pipeline y sus variables locales nunca se guardarán.

El ejemplo de código proporcionado:

@NonCPS
def version(text) {
  def matcher = text =~ '<version>(.+)</version>'
  matcher ? matcher[0][1] : null
}

El material adicional que respalda esto se puede encontrar en Pipeline Groovy Plugin Technical Design, aquí se discuten más detalles técnicos y el comportamiento de los métodos marcados con @NonCPS.

Los scripts de canalización pueden marcar métodos designados con la anotación @NonCPS. A continuación, se compilan normalmente (a excepción de las comprobaciones de seguridad de la zona de pruebas), por lo que se comportan de forma muy similar a los métodos “binarios” de la plataforma Java, el tiempo de ejecución Groovy o el código del complemento o del núcleo de Jenkins. Los métodos @NonCPS pueden usar de forma segura objetos no serializables como variables locales, aunque no deben aceptar parámetros no serializables o devolver o almacenar valores no serializables. No puede llamar a métodos regulares (transformados por CPS), o pasos de canalización, desde un método @NonCPS, por lo que es mejor usarlos para realizar algunos cálculos antes de pasar un resumen al script principal. Tenga en cuenta en particular que @Overrides de métodos definidos en clases binarias, como Object.toString (), en general deben estar marcados como @NonCPS ya que comúnmente será un código binario llamándolos.

Consulte: Serialización de variables locales y diseño técnico del complemento Groovy de canalización

Solo para mayor claridad, lo siguiente funcionó para mí.

El trabajo adicional para el desarrollador, como ejemplo, consulte el código a continuación.

my.Parameter NO es serializable

así que hago un método, sin una definición, lo anoto @NonCPS y lo llamo desde el bloque de nodos

  node('MySys') {
    echo 'hello'
    avoidCPS()
    echo 'finished'
  }

  @NonCPS
  avoidCPS () {
    // use my.Parameter here
    my.Parameter p = new my.Parameter()
    ... do some more ...
  }
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *