66 votes

Quel est l’effet de @NonCPS dans un script de pipeline Jenkins?

J'ai un pipeline de script dans Jenkins.

J'ai utilisé pour obtenir cette exception:

org.jenkinsci.les plugins.scriptsecurity.bac à sable.RejectedAccessException: Scripts qui ne sont pas autorisés à utiliser la méthode groovy.json.JsonSlurperClassic parseText java.lang.Chaîne

J'ai regardé l'exception et j'ai trouvé quelques indications que je doit annoter la méthode où theexception se produit avec @NonCPS. Je l'ai fait, sans vraiment comprendre ce que cela fait.

Après cela, cependant, une Exception que je lançais dans cette méthode n'était plus attiré par un try de la clause.

Alors, quelle est l'idée derrière le @NonCPS? Quels sont les effets de l'aide?

81voto

Jon S Points 7942

L'exception que vous voyez est en raison de script de sécurité et système de bac à sable. Fondamentalement, par défaut, lorsque vous exécutez un pipeline de script, il fonctionne dans un bac à sable qui ne permettent l'utilisation de certaines méthodes et de classes. Il y a des façons de mettre en liste blanche des opérations, consultez le lien ci-dessus.

L' @NonCPS d'annotation est utile lorsque vous avez des méthodes qui utilisent des objets qui ne sont pas sérialisables. Normalement, tous les objets que vous créez dans votre pipeline script doit être sérialisable (la raison pour cela est que Jenkins doit être en mesure de sérialiser l'état du script, de sorte qu'il peut être mis en pause et stockés sur le disque).

Lorsque vous placez @NonCPS sur une méthode, Jenkins va exécuter l'intégralité de la méthode en une seule fois, sans la possibilité de mettre en pause. Aussi, vous n'êtes pas autorisé à référencer tous les pipelines étapes ou CPS transformé les méthodes de l'intérieur de l' @NonCPS méthode annotée. Plus d'informations à ce sujet peuvent être trouvées ici.

Comme pour la gestion d'exception: Pas 100% sûr de ce que vous êtes en train de vivre; j'ai essayé ce qui suit, et il fonctionne comme prévu:

@NonCPS
def myFunction() {
    throw new RuntimeException();
}

try {
    myFunction();
} catch (Exception e) {
    echo "Caught";
}

et

@NonCPS
def myFunction() {
    throw new RuntimeException();
}

def mySecondFunction() {
    try {
        myFunction();
    } catch (Exception e) {
        echo "Caught";
    }
}

mySecondFunction();

et enfin:

@NonCPS
def myFunction() {
    throw new RuntimeException();
}

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

mySecondFunction();

Tous les travaux d'impression "Pris" comme prévu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: