149 votes

Quel est l'effet de @NonCPS dans un pipeline Jenkins script.

J'ai un pipeline script dans Jenkins.

J'avais l'habitude de recevoir cette exception :

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException : scripts non autorisés à utiliser la méthode groovy.json.JsonSlurperClassic. parseText java.lang.String

J'ai recherché l'exception et j'ai trouvé des indications selon lesquelles je devrais annoter la méthode où l'exception se produit avec @NonCPS . J'ai fait cela, sans vraiment comprendre ce que cela fait.

Après cela, cependant, l'exception que je lançais dans cette méthode n'était plus prise en compte par une méthode de type try clause.

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

3 votes

Le blog officiel de Jenkins contient un article qui présente cette annotation et peut vous aider. jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice

188voto

Jon S Points 7942

L'exception que vous voyez est due à script sécurité et le sandboxing. Fondamentalement, par défaut, lorsque vous exécutez un pipeline script, il s'exécute dans un bac à sable qui n'autorise que l'utilisation de certaines méthodes et classes. Il existe des moyens de mettre les opérations en liste blanche, consultez le lien ci-dessus.

El @NonCPS 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 doivent être sérialisables (la raison en est que Jenkins doit être capable de sérialiser l'état du script afin qu'il puisse être mis en pause et stocké sur le disque).

Quand vous mettez @NonCPS sur une méthode, Jenkins exécutera l'ensemble de la méthode en une seule fois sans possibilité de pause. De plus, vous n'êtes pas autorisé à faire référence à des étapes de pipeline ou à des méthodes transformées par le CPS à partir d'une méthode de type @NonCPS méthode annotée. Vous trouverez plus d'informations à ce sujet ici .

Quant à la gestion des exceptions : Je ne suis pas sûr à 100% de ce que vous rencontrez ; j'ai essayé ce qui suit et cela 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 affichent "Caught" comme prévu.

3 votes

Lorsque j'utilise @NonCPS, cette méthode ne peut pas être trouvée par Jenkins et j'obtiens une erreur du type suivante hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method

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:

X