2017-02-17 35 views
30

Jenkinsにパイプラインスクリプトがあります。Jenkinsパイプラインスクリプトの@NonCPSへの影響

私はこの例外を取得するために使用:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:メソッドを使用することはできません スクリプトgroovy.json.JsonSlurperClassic parseText java.lang.Stringで

私は例外を見て、例外が発生したメソッドに@NonCPSと注釈を付ける必要があることを示しました。私は、これが何をしているかを本当に理解することなく、これを行った。

その後、私がそのメソッドを投げているという例外は、もはやtry節で捕捉されませんでした。

@NonCPSの背後にあるアイデアは何ですか?それを使用する効果は何ですか?

答えて

37

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

@NonCPSアノテーションは、シリアライズ可能でないオブジェクトを使用するメソッドがある場合に便利です。通常、パイプラインスクリプトで作成するすべてのオブジェクトはシリアル化可能でなければなりません(これは、Jenkinsがスクリプトの状態をシリアル化して一時停止してディスクに保存できる必要があるためです)。

メソッドに@NonCPSを入力すると、ジェンキンスはメソッドを一気に実行し、一時停止することはできません。また、@NonCPS注釈付きメソッドの中からパイプラインステップやCPSで変換されたメソッドを参照することはできません。 More information about this can be found here

例外処理について:あなたが経験していることを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(); 

予想通り "キャッチ" のすべての印刷を。

関連する問題