ユーザ用ツール

サイト用ツール


software:jenkins

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
software:jenkins [2023/11/27 10:16] – [docker を使う場合] ogasoftware:jenkins [2023/11/27 10:38] (現在) – [class 定義] oga
行 167: 行 167:
 <code groovy> <code groovy>
 // ローダー // ローダー
-def script_lib= load "${WORKSPACE}/script/library_code.groovy" +def lib= load"${WORKSPACE}/script/library_code.groovy" ) 
-script_lib.lib_main()+lib.lib_main()
 </code> </code>
  
行 184: 行 184:
 ==== 外部コードのプロパティ ==== ==== 外部コードのプロパティ ====
  
-外部コード上で変数に値を保存しておいて、それを参照することはで+外部コード上で直接変数に値を保存しておいて、それを参照する場合は def く this を使う。変数宣言は return this を返す実行コンテキストのローカル変数とみなされるため
  
 <code groovy> <code groovy>
行 199: 行 199:
 </code> </code>
  
-変数宣言は return this を返す実行コンテキストのローカル変数とみなされため。+<code groovy> 
 +// library_code.groovy 
 + 
 +this.LocalPath= '~' 
 + 
 +def getLocalPath() 
 +
 +    return LocalPath  // ← でき 
 +
 + 
 +return this 
 +</code>
  
-もし上記のような使い方をしたい場合は@Field を使う。+どうしても def で宣言ておきたい場合は @Field を使う。
  
 <code groovy> <code groovy>
行 211: 行 222:
 def getLocalPath() def getLocalPath()
 { {
-    return LocalPath  // ← 期待通りに動く+    return LocalPath  // ← できる
 } }
  
行 239: 行 250:
  
  
 +==== class 定義 ====
 +
 +外部スクリプトファイル内で class 定義ができるが、groovy の場合実行するコードコンパイル時に型名が判明していなければならない。
 +そのため load した script 内ではその class 名を使用することができない。
 +
 +<code groovy>
 +def lib= load( "LibClass.groovy" )
 +def obj= new LibClass()   // ← エラー、このコードコンパイル時点で LibClass が定義されていないため
 +</code>
 +
 +<code groovy>
 +// LibClass.groovy
 +class LibClass {
 +
 +}
 +return this
 +</code>
 +
 +↓ ローダーを用意し、Lib と実行スクリプトに分ける必要あり
 +
 +<code groovy>
 +def lib= load( "LibClass.groovy" )
 +load( "main.groovy" )
 +</code>
 +
 +<code groovy>
 +// main.groovy
 +def obj= new LibClass()   // ← 成功
 +</code>
 +
 +また class 内では jenkins のデフォルト context が無効なので、node, stage, println などの jenkins の基本命令ですら直接実行することができなくなる。
 +必ず実行中の context を明示的に渡す必要がある。以下の例のように必ず **lib.** をつける必要あり。
 +
 +<code groovy>
 +class LibClass {
 +    def lib= null
 +    def LibClass( lib_ )
 +    {
 +        this.lib= lib_
 +    }
 +    def steps()
 +    {
 +        lib.node( 'agent01' ){
 +            lib.stage( 'stage' ){
 +                lib.println( "~" )
 +            }
 +        }
 +    }
 +}
 +</code>
 +
 +<code groovy>
 +// main.groovy
 +def obj= new LibClass( this )
 +</code>
 +
 +
 +また class 名は global な namespace に属するため、class 定義が含まれる script を複数回読み込むと多重定義エラーになる。
  
  
行 256: 行 325:
 } }
 </code> </code>
 +
 +ただし node() 命令の中でさらに node() 命令を使った場合、同じ自分自身の場合も executor を消費する。
 +
 +例えばすでに agent01 上で走っている場合に中でさらに node( 'agent01' ){ ~ } を実行すると、一つの job の実行に2つの executor を消費する。
 +このとき割当可能な executor がない場合はデッドロックする。
 +そのため入れ子になった node() 命令を多用する場合は、node の設定で「同時実行数」を多めに設定しておいた方が良い。
  
  
  
software/jenkins.1701047812.txt.gz · 最終更新: 2023/11/27 10:16 by oga

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki