Jenkins共有ライブラリでいくつかの動作が発生しています.誰かが私にこれを説明できれば素晴らしいでしょう:
創刊
ディレクトリにファイルがあるとしましょうvars
:
// MultiMethod.groovy
def Foo() { ... }
def Bar() { ... }
パイプラインからこれらの関数を使用したい場合、私がしたことは次のとおりです。
// Jenkinsfile
@Library('LibName') _
pipeline {
...
steps {
script {
// Method (1): this will work
def var = new MultiMethod()
var.Foo()
var.Bar()
// Method (2) this will not work
MultiMethod.Foo()
}
}
}
((1) と (2) のメソッドは、Groovy スクリプトでメソッドを呼び出すメソッドです。この 2 つの「メソッド」という言葉の使い方を混同しないでください。)
MultiMethod
したがって、これをnew
演算子でインスタンス化した場合にのみ機能します。
しかし、ファイルの名前を のmultiMethod
代わりに (camelCased) にするとMultiMethod
、メソッド (2) を使用してスクリプト内のメソッドを呼び出すことができます。誰かがこの動作を説明できますか?
それはうまくいっているようです。
第二号
上記の例に基づいています。という名前の groovy ファイルがある場合MultiMethod
( でインスタンス化すると、そのメソッドを使用できることを前に見ました)、次のように、ライブラリを動的にロードするときにnew
のオブジェクトをインスタンス化できないようです。MultiMethod
// Jenkinsfile
pipeline {
...
steps {
script {
// Method (1): this will not work
library 'LibName'
def var = new MultiMethod()
var.Foo()
var.Bar()
}
}
}
そうしようとすると、次のようになります。
Running in Durability level: MAX_SURVIVABILITY
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 11: unable to resolve class multiMethod
@ line 11, column 32.
def mult = new multiMethod()
^
1 error
at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:958)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUni
...
編集
これを行うと、次のことに気付きます。
// Jenkinsfile
pipeline {
...
steps {
script {
library 'LibName'
MultiMethod.Foo()
MultiMethod.Bar()
}
}
}
それは動作します!!
最後の質問
よろしければ別の質問。私は人々が書くことに慣れていることに気づきました
return this
vars
ディレクトリ内のスクリプトの最後。誰かがそれが何のために良いのか説明できますか? なぜこれらのスクリプトがグローバル変数に変わるのかなど、このメカニズムがどのように機能するのかという文脈で誰かがこれを説明できれば幸いです。
ありがとう