2017-07-06 3 views
0

私は自分のJenkins共有ライブラリを作成して、パイプライン間でコードを再利用しています。私はステップを作成する方法を知っていますが(実際には簡単ですが)、jenkinsfile(またはJenkinsがログで言うようにWorkflowScript)で "utils class"にアクセシブルにしたいときに問題があります。 私は例えば、私はこのようなログクラスを作成したい、「Utilのクラス」フォルダのsrc /私/ドメインにあるGroovyのクラス/ ...多くのメソッドを持って呼び出します。Jenkins共有ライブラリインスタンス化utilクラスとワークフロースクリプトで使用

# src/my/domain/group 

package my.domain.group 

class Console implements Serializable { 

    def log(msg) { 
     spit(msg, '\033[34m') 
    } 

    def error(msg) { 
     spit(msg, '\033[31m') 
    } 

    def warning(msg){ 
     spit(msg, '\033[33m') 
    } 

    def success(msg){ 
     spit(msg, '\033[32m') 
    } 

    private def spit(msg, color){ 
     ansiColor('xterm') { 
      echo color + msg + '\033[0m' 
     } 
    } 

} 

そして私その一例と同様に、いくつかのコードでJenkinsfileからアクセスすることができます/vars/library.groovy内のファイルでインスタンス化しよう:

node("mynode"){ 
    console.log("Hello World!") 
} 

アイデアは、すべてのスクリプトでコンソールをインスタンス化し、それを作るために避けるためです自動的に、私はいくつかのようなものを試みました

# vars/library.groovy 

import my.domain.group.Console 
import groovy.transform.Field 

@Field String console = new Console() 

または

# vars/library.groovy 

import my.domain.group.Console 

def load(){ 
    this.console = new Console() 
    // And also 
    console = new Console() 
} 

しかし、私は常にエラーを取得ジェンキンスファイルからアクセスしようとして: groovy.lang.MissingPropertyException:いいえ、そのようなプロパティ:クラスのコンソール:WorkflowScript

私は、この手段を理解しますインスタンスが正しいスコープにないため、スクリプトで直接見ることはできませんが、どうすればよいのでしょうか?

ありがとうございます!

答えて

2

あなたJenkinsfileの内側に誤ってvarsスクリプトを使用しているように見えますが、私はいくつかの混乱を解決しようとします:) varsディレクトリに定義されて

  1. のGroovyスクリプトがカスタム」として、そのファイル名で呼ばれています"あなたのJenkinsfileのステップ。さらにvarsスクリプトのみcallという単一の機能が含まれており、必要に応じなければならない

    node ("mynode") { 
        library "Hello World!" 
    } 
    
  2. スクリプト名がlibrary.groovyまま(括弧は省略可能であるため)、あなたのJenkinsfileこの

    node ("mynode") { 
        library("Hello World!") 
    } 
    

    または代わりのようになりますと仮定すると、輸入。ログメッセージを文字列として渡したいので、call関数にはさらにパラメータが必要です。だから、varsであなたのlibrary.groovyスクリプトは、インポートされたすべての基本的なジェンキンス手順(shbat、など)あなたのJenkinsfileであなたができる限り、加えて任意のGroovy/Javaクラスを使用することができますcall関数内この

    # vars/library.groovy 
    
    import my.domain.group.Console 
    
    def call(msg){ 
        Console console = new Console(steps) 
        console.log(msg) 
    } 
    

    ようになります。 importConsoleクラスのような)

    気づいたことがあるかもしれませんが、私はまた、の変数のコンストラクタにsteps変数(手動で宣言またはインスタンス化する必要はありません)を追加しました。これは、srcディレクトリに定義された任意のクラスでJenkinsのステップを直接使用することができないために必要です。その結果、方法

    private def spit(msg, color){   
        ansiColor('xterm') { 
         echo color + msg + '\033[0m' 
        } 
    } 
    

    はJenkinsのステップなので、このメソッドは機能しません。クラス内でechoを使用するには、steps変数をコンストラクタに渡して、クラス内の別の変数に格納します。そして、あなたはそれを動作させる必要がありますsteps.echo "Hello World"

    # src/my/domain/group 
    
    package my.domain.group 
    
    class Console implements Serializable { 
    
        def steps 
    
        Console(steps) { 
         this.steps = steps 
        } 
    
        def log(msg) { 
         spit(msg, '\033[34m') 
        } 
    
        def error(msg) { 
         spit(msg, '\033[31m') 
        } 
    
        def warning(msg){ 
         spit(msg, '\033[33m') 
        } 
    
        def success(msg){ 
         spit(msg, '\033[32m') 
        } 
    
        private def spit(msg, color){ 
         ansiColor('xterm') { 
          steps.echo color + msg + '\033[0m' 
         } 
        } 
    } 
    

のようなすべてのジェンキンスの手順を呼び出すことができます。

あなたのlibrary.groovyの名前をvarsに変更することを考えてください(たとえば、myLog.groovy)。次に、あなたのJenkinsfileは、あなたがvars内の追加のスクリプトを作成することができ、あなたのConsoleクラスの他のメソッドを使用するためには、この

node ("mynode") { 
    myLog "Hello World!" 
} 

ようになります。それらを使用すると、

node ("mynode") { 
    myLog "Hello World!" 
    myWarning "Hello World!" 
    myError "Hello World!" 
    mySuccess "Hello World!" 
} 

次のようになります(既存のジェンキンスステップで名前の衝突を避けるために my接頭辞を使用してイム。例えば、 errorステップがすでに存在し、あなたのJenkinsfileでそれを呼び出すと、あなたのビルドをキャンセルさせていただきます)

共有ライブラリについての詳細情報については

https://jenkins.io/doc/book/pipeline/shared-libraries/

でジェンキンスのドキュメントをチェックアウトあなたはhttps://jenkins.io/doc/pipeline/steps/workflow-basic-steps/

ですべての基本的なジェンキンスステップの完全なリストを見つけることができます

ジェンキンスとパイプラインを動作させることは大変面倒な作業ですが、最終的にはその価値があります。このテキストの壁が少し助けてくれることを願っています。幸運と幸せコーディング:)

+0

あなたのお返事ありがとうアドリアン!私はステップを使用する方法を知っていますが、このコードを私の例に残すことを忘れてしまいました:-)あなたの答えを読んで、私はクラスのインスタンスをJenkinsのパイプラインで直接使うことができないことを理解できますか?私はコンソールで自分のメソッドのそれぞれについて異なるステップを作成するオプションを知っていますが、コンソールのインスタンスを直接varsから公開する方がはっきりしていると思います(これが可能であれば知っていますか?)、Jenkinsファイル私が私の例で示すように直接。 – joliva

+0

'library.groovy'スクリプトを' vars'の中に入れなくても、Jenkinsfileで 'Console'クラスを直接使うことができます。 '@Library( '[LIB_NAME]')_'を使ってあなたの共有ライブラリをインポートするようにしてください。ここで' [LIB_NAME] 'はJenkinsの設定で指定したライブラリの名前で、' my.domain。あなたのJenkinsfileの中の "util.Console'を開きます。 –

関連する問題