Saltar al contenido

Canalización de Jenkins java.io.NotSerializableException java.util.regex.Matcher error incluso con @NonCPS

Posterior a de esta larga compilación de datos resolvimos esta problema que presentan muchos los usuarios. Te ofrecemos la respuesta y nuestro objetivo es resultarte de gran ayuda.

Solución:

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

def m = (logLine =~ TEST_LOGLINE_END_REGEX)

Sin def se crea una variable en un enlace de script global y, por lo tanto, aún 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 característica permite que las canalizaciones mantengan su estado y continúen incluso después de reiniciar el servidor. Las variables de tipo Matcher no son serializables y requieren un trabajo adicional por parte del desarrollador.

Desde jenkinsci/pipeline-plugin Serialización de 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 =~ '(.+)'
  matcher ? matcher[0][1] : null

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

Los scripts de canalización pueden marcar los métodos designados con la anotación @NonCPS. Luego, estos se compilan normalmente (excepto para las comprobaciones de seguridad de la zona de pruebas) y, por lo tanto, se comportan de manera muy similar a los métodos “binarios” de la plataforma Java, el tiempo de ejecución de Groovy o el código central o del complemento 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 ni 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 marcarse como @NonCPS, ya que normalmente será un código binario quien los llamará.

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

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

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

my.Parameter NO es serializable

así que creo un método, sin definición, lo anoto como @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 ...
  

Reseñas y calificaciones del artículo

Si entiendes que ha resultado de ayuda este post, agradeceríamos que lo compartas con otros desarrolladores y nos ayudes a difundir esta información.

¡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 *