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 ...
}