Tengo una canalización de secuencia de comandos en Jenkins.

Que utiliza para obtener esta excepción:

org.jenkinsci.los plugins.scriptsecurity.sandbox.RejectedAccessException:
Los Scripts no se permite el uso del método de groovy.json.JsonSlurperClassic
parseText java.lang.Cadena de

Miré la excepción y he encontrado algunos indicios de que debo anotar que el método en donde theexception se produce con @NonCPS. Hice esto, sin entender realmente lo que esto hace.

Después de que, sin embargo, una Excepción que estaba tirando en que el método no fue sorprendido por un try cláusula.

Así que ¿cuál es la idea detrás de @NonCPS? ¿Cuáles son los efectos de su utilización?

InformationsquelleAutor octavian | 2017-02-17

1 Comentario

  1. 92

    La excepción de que usted está viendo es debido a secuencia de comandos de seguridad y sandboxing. Básicamente, por defecto, cuando se ejecuta una tubería de secuencia de comandos, se ejecuta en un entorno limitado que sólo permiten el uso de ciertos métodos y clases. Hay maneras a la lista blanca de operaciones, compruebe el enlace de arriba.

    La @NonCPS anotación es útil cuando se tienen los métodos que utilizan los objetos que no son serializables. Normalmente, todos los objetos que se crean en su línea de secuencia de comandos debe ser serializable (la razón de esto es que Jenkins debe ser capaz de serializar el estado de la secuencia de comandos para que pueda ser detenido y se almacenan en el disco).

    Cuando se pone @NonCPS sobre un método, Jenkins se ejecutará el método completo de una sola vez sin la capacidad para hacer una pausa. También, usted no tiene permiso para hacer referencia a cualquier tubería de pasos o CPS transformado los métodos de dentro de un @NonCPS anotado método. Más información sobre esto se puede encontrar aquí.

    Como para el manejo de excepciones: No es 100% seguro de lo que está experimentando; he probado 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 por último:

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

    De impresión «Atrapado» como era de esperar.

    • Esta respuesta resuelto mi problema. Muchas gracias!
    • si la respuesta resuelve tu problema se puede seleccionar como una solución a esta pregunta.
    • Por desgracia no pude ya que no me abre esa pregunta! Pero yo lo haría de otra manera. Saludos.

Dejar respuesta

Please enter your comment!
Please enter your name here