このスクリプト化されたJenkinsパイプラインを適切にリファクタリングして、共通のコードを1つのファイルに保存するにはどうすればよいですか?

マット

背景:私は、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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ