2

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ディレクトリ内のスクリプトの最後。誰かがそれが何のために良いのか説明できますか? なぜこれらのスクリプトがグローバル変数に変わるのかなど、このメカニズムがどのように機能するのかという文脈で誰かがこれを説明できれば幸いです。

ありがとう

4

1 に答える 1