smart script plugin para example descargar consola jenkins groovy

plugin - ¿Cuál es el efecto de @NonCPS en un script de canalización de Jenkins?



plugin de groovy para smart tv (1)

Tengo un guión de pipeline en Jenkins.

Solía ​​tener esta excepción:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: los scripts no pueden usar el método groovy.json.JsonSlurperClassic parseText java.lang.String

Miré la excepción y encontré algunas indicaciones de que debería anotar el método donde se produce la @NonCPS con @NonCPS . Hice esto, sin entender realmente lo que hace.

Después de eso, sin embargo, una excepción que estaba lanzando en ese método ya no fue atrapada por una cláusula try .

Entonces, ¿cuál es la idea detrás de @NonCPS ? ¿Cuáles son los efectos de usarlo?


La excepción que está viendo se debe a la seguridad del script y al sandboxing. Básicamente, de manera predeterminada, cuando ejecuta un script de canalización, se ejecuta en un entorno limitado que solo permite el uso de ciertos métodos y clases. Hay formas de incluir en la lista blanca las operaciones, consulte el enlace de arriba.

La anotación @NonCPS es útil cuando tiene métodos que usan objetos que no son serializables. Normalmente, todos los objetos que cree en su secuencia de comandos de canalización deben ser serializables (la razón de esto es que Jenkins debe poder serializar el estado de la secuencia de comandos para que pueda pausarse y almacenarse en el disco).

Cuando pones @NonCPS en un método, Jenkins ejecutará todo el método de una vez sin la capacidad de pausar. Además, no puede hacer referencia a ningún paso de canalización ni a métodos transformados CPS desde un método anotado @NonCPS . Más información sobre esto se puede encontrar aquí .

En cuanto al manejo de excepciones: no estoy 100% seguro de lo que está experimentando; He intentado lo siguiente y funciona como se esperaba:

@NonCPS def myFunction() { throw new RuntimeException(); } try { myFunction(); } catch (Exception e) { echo "Caught"; }

y

@NonCPS def myFunction() { throw new RuntimeException(); } def mySecondFunction() { try { myFunction(); } catch (Exception e) { echo "Caught"; } } mySecondFunction();

y finalmente:

@NonCPS def myFunction() { throw new RuntimeException(); } @NonCPS def mySecondFunction() { try { myFunction(); } catch (Exception e) { echo "Caught"; } } mySecondFunction();

Todos imprimen "Atrapado" como se esperaba.