Jenkinsにパイプラインスクリプトがあります。
私はこの例外を取得していました:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:スクリプトはメソッドgroovy.json.JsonSlurperClassicのparseText Java.lang.Stringの使用を許可されていません
例外を調べたところ、例外が発生したメソッドに@NonCPS
をアノテーションする必要があることを示す兆候がいくつか見つかりました。これが何をするのかを本当に理解することなく、私はこれをしました。
しかしその後、そのメソッドでスローしていたExceptionがtry
句でキャッチされなくなりました。
@NonCPS
の背後にある考え方は何ですか?それを使うことの効果は何ですか?
あなたが見ている例外は スクリプトセキュリティ とサンドボックス化によるものです。基本的に、デフォルトでは、パイプラインスクリプトを実行すると、サンドボックス内で実行され、特定のメソッドとクラスの使用しか許可されません。操作をホワイトリストに追加する方法があります。上記のリンクを確認してください。
@NonCPS
アノテーションは、直列化できないオブジェクトを使うメソッドがあるときに便利です。通常、パイプラインスクリプトで作成するすべてのオブジェクトはシリアライズ可能でなければなりません(これは、Jenkinsがスクリプトの状態をシリアライズして一時停止してディスクに保存できるようにする必要があるためです)。
メソッドに@NonCPS
を付けると、Jenkinsは一時停止することなくメソッド全体を一度に実行します。また、@NonCPS
アノテーション付きメソッド内からパイプラインステップまたはCPS変換済みメソッドを参照することはできません。 これに関するより多くの情報はここで見つけることができます 。
例外処理に関しては:あなたが何を経験しているのか100%わからない。私は以下を試してみました、そしてそれは予想通りに動作します:
@NonCPS
def myFunction() {
throw new RuntimeException();
}
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
そして
@NonCPS
def myFunction() {
throw new RuntimeException();
}
def mySecondFunction() {
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
}
mySecondFunction();
そして最後に:
@NonCPS
def myFunction() {
throw new RuntimeException();
}
@NonCPS
def mySecondFunction() {
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
}
mySecondFunction();
すべての印刷物は期待どおりに「キャッチ」されました。