2017-11-09 19 views
1

私はメソッドを定義することができましたが、Jenkins共有ライブラリを使用して変数を定義することは、これまで未解決の問題でした。jenkins共有ライブラリを使用して変数を定義するにはどうすればよいですか?

私はこの体

def call() { 
    return true 
} 

そして今Jenkinsfile内部で/vars/True.groovyを追加し、私は期待通りに動作するかどうかをテストしてみました:それはtrue != class Trueを考慮して

println "evaluation ${ true == True }" 

しかし、驚き、これは失敗します。私の印象は、true == True()が動作するかもしれないが、それはポイントではない、その全目的は、間違ったケースを使っている人々によって引き起こされたいくつかのエラーを避けることだったので、本当の変数が必要である。

だから、魔法は何ですか?

+0

'vars'はおそらくシングルトンとしてインスタンス化されています。私はそれらが何らかの名前で結ばれると思います。ドキュメンテーションは、グローバル変数を定義する方法があるはずであることを暗示しているようですが、私は魔法のトリックが何であるか分かりません。私が思う 'call()'定義はメソッドとしてコンパイルされているので、そのアプローチはうまくいくとは思えませんが、 'class TrueはSerializable {// some equals()定義とstuff}を実装します。作業。しかし、あなたが言ったように、キャスティングが必要な魔法のJenkinsの呪文があります。 – mkobit

答えて

0

変数Trueは間違いなく変数True/vars/True.groovyで定義)のオブジェクトへの参照を保持します。 このよう

println "evaluation ${ true == True() }" 

奇妙1それを使用します:次の2つのオプション
良いものを持っ あなたは/vars/True.groovy

public boolean equals(obj) { 
    return obj == true; 
} 

equals()メソッドをオーバーライドすることができ、これは

を動作するはずです
println "evaluation ${ true == True }" 

しかし、それは本当に奇妙で、誤解を招く可能性があります。

+0

最初のものは "動作"していますが、変数を定義するという問題に対処していないので、無駄です。 2番目の変数は変数を定義しません。 Groovy.lang.MissingPropertyException例外が発生しました:そのようなプロパティはありません:クラス:groovy.lang.BindingのFalse 可能な解決策:クラス \t groovy.lang.Binding.getVariable(Binding.java:63) ) \t at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:242) – sorin

+0

これは、 '/ vars /'がインポートではなく、代わりにJenkinsがそれぞれを評価し、個々のクラス。私はこの刑務所を逃れる方法があるのだろうかと思っています。ディレクトリがvarsと呼ばれているという事実は本当に本当に間違いです。 – sorin

+0

@sorinエラーは、 'False'変数がないことを示します。 'def'キーワードなしで'/vars/TrueDefiner.groovy'に定義してもよろしいですか?完全なコードplsを表示 –

0

varsディレクトリに定義されているグローバル変数は、ラクダ/ラクダ/おそらく他の特殊なケースである必要があります。これはDefining global variablesセクションの中でどこにも明記されていませんが、このノートが一番上にあります:

varsディレクトリには、パイプラインからアクセス可能なグローバル変数を定義するスクリプトをホストします。それぞれの*.groovyファイルのベースネームは、Groovy(〜Java)識別子でなければならず、普通は​​camelCasedです。一致する*.txtが存在する場合は、システムに設定されたマークアップフォーマッタで処理されたドキュメントが含まれている可能性があります(実際にはHTML、Markdownなどありますが、拡張子はtxtです)。ここで

私が試したものです:

  • vars/MyTrue.groovy

    class MyTrue implements Serializable { 
    } 
    
  • vars/myTrue.groovy

    class myTrue implements Serializable { 
    } 
    
  • echo("MyTrue: ${Class.isInstance(MyTrue)}") 
    echo("myTrue: ${Class.isInstance(myTrue)}") 
    echo("mytrue: ${Class.isInstance(mytrue)}") 
    echo("What bindings are there?: ${binding.variables}") 
    

    :彼らはインスタンスやClass種類(なしスクリプトのセキュリティは、ここで有効になっていない)しているかどうかをテストするvars/mytrue.groovy

    class mytrue implements Serializable { 
    } 
    
  • vars/doesCasingMatter.groovy

    class DoesCasingMatter implements Serializable { 
    } 
    

そして、私のパイプラインのスクリプトでこれはプリントアウト:

[Pipeline] echo 
MyTrue: true 
[Pipeline] echo 
myTrue: false 
[Pipeline] echo 
mytrue: false 
[Pipeline] echo 
What bindings are there?: [steps:[email protected], myTrue:[email protected], mytrue:[email protected]] 

これは、クラス名がコンパイルおよび作成される方法を決定すると思われるようです。最初の例は、vars/True.groovyに似ていますが、クラスとしてインポートされ、インスタンス化されません。他の2つはコンパイルされ、インスタンス化され、定義されたクラス名でスクリプトにバインドされます。私はあなたがそれらをグローバル変数にしたいならば、あなたのクラスを異なって定義しなければならないと思います。

関連する問題