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.