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

J’ai un script de pipeline dans Jenkins.

J’avais l’habitude d’obtenir cette exception:

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

J’ai regardé l’exception et j’ai trouvé des indications que je devais annoter la méthode où l’exception 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 interceptée par une clause try .

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

L’exception que vous rencontrez est due à la sécurité des scripts et au sandboxing. Fondamentalement, par défaut, lorsque vous exécutez un script de pipeline, il s’exécute dans un sandbox qui autorise uniquement l’utilisation de certaines méthodes et classes. Il existe des moyens de gérer les listes blanches, consultez le lien ci-dessus.

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

Lorsque vous mettez @NonCPS sur une méthode, Jenkins exécutera la méthode complète en une seule fois sans pouvoir faire de pause. De plus, vous n’êtes pas autorisé à référencer des étapes de pipeline ou des méthodes transformées CPS à partir d’une méthode annotée @NonCPS . Plus d’informations à ce sujet peuvent être trouvées ici .

En ce qui concerne la gestion des exceptions: pas sûr à 100% de ce que vous vivez; 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 imprimer “Caught” comme prévu.