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