背景:私は、Jenkinsを使用して検証方法を改善しようとしているハードウェア設計者です。
私はここでJenkinsfilesとgroovyに関する多くの質問を調べて、それらのどれも私の問題に到達していないようです。チームの他のメンバーができる限り簡単にできるようにし、このディレクトリで実行するすべてのジョブを1つの単純なデータ構造で指定できるようにします。例:
def targets = [
"Build number 1" : "make build",
"Some other run command" : "custom_script"
]
私のアイデアは、次のようなテンプレートJenkinsfileを作成して使用することでした。
def targets = [.....]
node {
scm......
load "common/Jenkinsfile"
}
次に、common / Jenkinsfileを使用して、これらのターゲットをステージに変換するコードを含めます。
try {
targets.each {entry ->
stage (entry.key) {
sh "${complicated_command_prefix} $entry.value ${complicated_command_suffix}"
}
}
}
catch (e) {
emailext (
// yadda yadda
)
throw e
}
これは、loadコマンドではなく、そのコードをJenkinsfileに直接配置した場合に機能します。ただし、コードはloadで機能しないため、loadはCプリプロセッサの#includeよりも高度な処理を実行していることは明らかです。
最初は、ターゲットが定義されていないことに関連するエラーが発生します(おそらくロードされたファイルのスコープ外にあるため)。誰かが「env」を追加することを提案しました。ターゲットの前のプレフィックスとして、構文エラーは解決されましたが、実際にはステージは実行されません。
では、ロードされたファイルに「ターゲット」を適切に渡して、そこで生成されたステージが適切に処理されるようにするにはどうすればよいでしょうか。あるいは、これをより良くするための他のオプションはありますか?
編集:ロードされた共通ファイルに「deftargets」を直接貼り付けようとしましたが、ステージは正しく処理されます。したがって、問題は、ロードされたファイルが想定どおりに機能しないということではなく、親のJenkinsfileから「targets」の値を受け取っていないということです。
理解した!Jenkinsfileでこの奇妙な変数のスコープ動作を見つけました。これは、defを省略すると、変数が外部に表示されることを説明しています。そしてそうです。だから私は今defなしでターゲットを定義します。成功!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加