Jenkins パイプライン スクリプトにおける @NonCPS の効果は何ですか? 質問する

Jenkins パイプライン スクリプトにおける @NonCPS の効果は何ですか? 質問する

Jenkins にパイプライン スクリプトがあります。

以前は次のような例外が発生していました:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: スクリプトはメソッド groovy.json.JsonSlurperClassic parseText java.lang.String の使用を許可されていません

例外を調べたところ、例外が発生したメソッドに という注釈を付けるべきであるという指示がいくつか見つかりました@NonCPS。私は、これが何をするのかよく理解せずに、これを実行しました。

しかしその後、そのメソッドでスローしていた例外は、try句によってキャッチされなくなりました。

では、その背後にあるアイデアは何でしょうか@NonCPS? それを使用することでどのような効果が得られるのでしょうか?

ベストアンサー1

表示されている例外は、スクリプトセキュリティサンドボックス化。基本的に、デフォルトでは、パイプライン スクリプトを実行すると、特定のメソッドとクラスの使用のみを許可するサンドボックス内で実行されます。操作をホワイトリスト化する方法があります。上記のリンクを確認してください。

この@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();

すべて予想どおりに「Caught」と出力されます。

おすすめ記事