2016-10-02 8 views
1

新しいビルドを設定しています。簡単なシェルコマンドを実行すると、以下のように、完璧に動作します:jenkinsfileでカスタムクラスに移動するとコマンドが失敗する

stage("Demo") {  
    sh "echo 'Hi There'" 
} 

私は少し物事をneatenするための独自のクラスに「パッケージ」私のシェルスクリプトにしようとしています。

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: 分類されていないメソッドのjava.lang.Class問題は、クラス内から同じ正確なシェルスクリプトを実行しようとすると、ジェンキンスさんはでビルドを失敗したということですSHはjava.lang.Stringは

これは、独自のクラスに上記の方法を移動した後、私のために失敗した簡単な例です:

stage('Demo stage') { 
    Tools.PrintMe("Hi There") 
} 

public class Tools { 
    public static void PrintMe(String message) { 
     sh "echo " + message 
    } 
} 

もスクリプトmanagで提供オプションがありませんこの拒否されたメソッドをホワイトリストに追加します。

これを回避する方法はありますか?それとも、私が気付いていない限界がありますか?

答えて

3

@Craitあなた自身のクラスで定義済みのステップを呼び出すには、スクリプトオブジェクトをクラスにパスする必要があります。

だから、これを試してみてください。

stage('Demo stage') { 
    Tools.PrintMe(this, "Hi There") 
} 

public class Tools { 
    public static void PrintMe(def script, String message) { 
     script.sh "echo " + message 
    } 
} 
3

@sshepelは、先に指摘したように、プレーンなスクリプトで実行されるコードは、クラス内のコードと同じコンテキストではありません。上記と同様の方法で、スクリプトオブジェクトへの静的な参照を作成し、それを自分のクラスで実行することで解決しました。

//Set the static reference in the script 
Script.environment = this 

public class Script { 
    public static environment 
} 

public class Tools { 
    public static void PrintMe(String message) { 
     Script.environment.sh "echo " + message 
    } 
} 

この方法で、スクリプトオブジェクトを渡してメソッドシグニチャを汚染しないようにしました。欠点は、すべてのクラスが "Script.environment = this"を設定することに依存することです。

関連する問題