2017-02-15 8 views
0

を反復しませ.each:予期しない動作:私は次のようにグルーヴィー・ジェンキンスパイプラインに(私に)いくつかの予期しない動作が低下している

def a = ['a','b','c'] 
def ctx = [ alljobs: a ] 
def say(s) {println "$s"} 

@NonCPS 
def fn(ctx) { 
    say "ctx.alljobs=$ctx.alljobs" 
    ctx.alljobs.each { j -> say "$j" } 
    say "done" 
} 
say "before fn()" 
fn(ctx) 
say "after fn()" 

次のスクリプトコードとジェンキンスパイプラインプロジェクトを作成します。私はジェンキンス(以下@NonCPS)の外Groovyのインタプリタでこれを実行すると、私は私が期待される出力を得る:私はジェンキンスパイプラインジョブを実行すると

before fn() 
ctx.alljobs=[a, b, c] 
a 
b 
c 
Done. 
after fn() 

は、私は以下を参照してください。

Started by user John Elion (john.elion) 
[Pipeline] echo 
before fn() 
[Pipeline] echo 
ctx.alljobs=[a, b, c] 
[Pipeline] echo 
after fn() 
[Pipeline] End of Pipeline 
Finished: SUCCESS 

.eachはまったく実行されていません(これは一度だけ実行されています - これは簡単なコードスニペットに縮小しようとするプロンプトです)、関数は放棄されています。印刷されませんが、関数が返された後のsayが実行されています。

例外が発生しているかどうかを確認するためにtry-catchでさまざまなブロックをラップしようとしましたが、運がありません。何か不足していますか?私はジェンキンス以外の通訳者に見られる振る舞いを期待するのは間違っていますか?

パイプラインのバグ?または私は何かを逃していますか?

私はJenkins v2.44で実行しています。それは緊密にロックされた環境です。私はそれが何らかのLinux上で動作していることを知っています。私はworkflow-cps 'Pipeline:Groovy' v2.26を持っていると思うし、他のパイプラインや他のプラグインがどれに関係しているのか分からない。

ありがとうございます。

答えて

0

単純な答えは、 "say"は@ NonCPSである必要があるということです。それは期待どおりに動作します。

@NonCPSが内部で捕捉され処理される例外をスローするために例外が発生しているように見える理由があります。技術的な詳細については、https://github.com/jenkinsci/workflow-cps-plugin/blob/master/README.mdを参照してください。

は、それはいくつかの状況の

+2

一つ...通訳は@NonCPS機能は黙っ機能を中止し、パイプラインでの移動ではなく、CPS対応の関数を呼び出す際にユーザに見えるエラーを発生させるべきと思われますあなたのスクリプトに間違ったことがあった場合、Jenkinsは十分な情報を提供しません。 –