Jenkinsパイプラインスクリプトでの@NonCPSの影響とは


110

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

以前はこの例外を取得していました:

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

例外を調べたところ、で例外が発生するメソッドに注釈を付ける必要があることがわかりました@NonCPS。これが何をするのか本当に理解せずに私はこれをしました。

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

では、背後にあるアイデアは@NonCPS何ですか?使用するとどのような影響がありますか?


1
jenkins公式ブログには、この注釈を紹介する記事があり、役立つ場合があります。jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice
民文濤

回答:


141

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

この@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」を印刷します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.