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
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