2016-10-21 10 views
4

ビルドのタスクセットを並列に実行する必要があります。ビルドのタスクは動的に変更される可能性があります。私はそれの詳細は以下の実装でいくつかの助けが必要です。jenkinsパイプラインプラグインを使用して動的な並列ビルドを実装するアイデア

私はビルドのタスクの詳細は、タスクがパラレル/シリアル

例で実行されなければならないの情報を持っていますXMLで動的に生成されます。

は、ビルドA.

があると言いますタスク及び実行順序下にあっ

、最初のタスク1は、次タスク2とTASK3が並列に実行され、次の4

TASK1タスクが実行されなければならない
タスク2、TASK3
task4

は、これらの詳細は、どのようにパイプライン・プラグインを使用して、それに応じてそのXMLとスケジュールタスクを解析することができ、動的に生成されたXMLであろう。私は始めるためにいくつかのアイデアが必要です。

答えて

12

あなたは、同様の以下にワークスペースからファイルを読み取る(readFile)をグルービーを使用し、異なる閉鎖を含むマップを生成することができる:

parallel(
    task2: { 
    node { 
     unstash('my-workspace') 
     sh('...') 
    } 
    }, 
    task3: { 
    node { 
     unstash('my-workspace') 
     sh('...') 
    } 
    } 
} 

このようなデータ構造を生成するために、前に読んだファイルの内容に対して、GroovyでXML解析を使用して読み取られたタスク・データを単純に反復処理します。

昨日私はパイプラインについて話をし、非常によく似た例(presentation、スライド34ff)を含んでいました。対照的に、別のコマンド出力から「タスク」のリストを読みました。完全なコードはhereで見つけることができます(これをここに貼り付けるのを避け、代わりにこのオフサイトリソースを参照してください)。

魔法ビットの種類は次のとおりです。

def parallelConverge(ArrayList<String> instanceNames) { 
    def parallelNodes = [:] 

    for (int i = 0; i < instanceNames.size(); i++) { 
     def instanceName = instanceNames.get(i) 
     parallelNodes[instanceName] = this.getNodeForInstance(instanceName) 
    } 

    parallel parallelNodes 
} 

def Closure getNodeForInstance(String instanceName) { 
    return { 
     // this node (one per instance) is later executed in parallel 
     node { 
      // restore workspace 
      unstash('my-workspace') 

      sh('kitchen test --destroy always ' + instanceName) 
     } 
    } 
} 
+0

あなたはreadFile' 'でファイルを読んだ後は、どのようにあなたがそれを解析し、その結果を反復処理することができますか?パイプラインDSLは多くの便利なツールを取り除いているようです。どのビルドをトリガするかを判断するためにJSONファイルを解析したいのですが、パイプライン定義内で 'JSON'や' JsonSlurper'を使うことはできません。 – jayhendren

+0

@jayhendrenという別の質問をしてください。あなたは宣言的なパイプラインを使っているようです。スクリプト化されたパイプラインだけが無限の可能性を提供します! – StephenKing

+0

あなたの答えでは答えられなかった質問の重要な部分であるように思われたので、私は質問として投稿しました。スクリプト化されたパイプラインのヒントをありがとう。私はかなりパイプラインの新人ですが、依然として両者の違いをはっきりさせません。 – jayhendren

関連する問題