1

ジェンキンス パイプラインの異なるステージに同じノードを割り当てる必要があります。シナリオは、分散 JMeter テストを実行する必要があり、次のようにパイプラインを作成することです。

  • ステージ 1: ソース コードとテストのフェッチ、ソースのコンパイルと依存関係のインストール、デーモン プロセスとしての jmeter-server の実行、現在のノードの IP アドレスの取得など、いくつかのエージェントを並行してセットアップします。
  • ステージ 2: ステージ 1 に同じノードを割り当て、1 つのノードを JMeter マスター ノードとして使用します。ステージ 1 のすべてのノードの IP アドレスのリストを JMeter.sh プロセスに渡し、分散テストを実行します。
node("master"){
    def LIST_IP_ADDRESS_NODES=[]
    stage("Setup-JMeter-Agent"){
        parallel "node1":{
           node("specifice-label"){
                //fetch souces code and test.
                //compile sources
                //install dependencies
                // start JMeter-server
                //get IP Address
                LIST_IP_ADDRESS_NODES.add(current_ip)
            }
        },
        "node2":{
            node("specifice-label"){
                //fetch souces code and test.
                //compile sources
                //install dependencies
                // start JMeter-server
                //get IP Address
                LIST_IP_ADDRESS_NODES.add(current_ip)
            }
        }
    }
    stage("Run-Jmeter-Test"){
        parallel "node1":{
           node("specific-label"){
                //run jmeter.sh with the list of IP address of nodes in stage1.
            }
        },
        "node2":{
            node("specific-label"){
                waitUntil {
                    // check if JMeter-master is finished.
                }
            }
        }
    }
}

問題は、ステージ2に割り当てられたノードがステージ1の同じノードであることを確認する方法です? 別の並行ジョブspecific-labelがステージ 1 で設定されたラベルを使用していくつかのノードを割り当てると、パイプラインは失敗します。その結果、ステージ 2 はいくつかのクリーンなノードを割り当て、テストの実行に失敗します。

specific-labelパイプラインに必要な 2 ノードよりも多くのラベルを持つノードがあり、パイプラインの障害がより頻繁に発生する場合、ステージ 1 とステージ 2 で異なるノードを割り当てる可能性が高くなる可能性があると思います。lockそのため、ステージ1のノードをロックし、ステージ2で使用するためにノードを予約できるプログラミング言語のようなメカニズムがあるのではないかと思います。

ありがとう。

4

2 に答える 2

0

特にノードを要求していないステージはすべて、これらのステージの親ノードに割り当てられた同じノードで実行できる宣言型パイプラインを調べることができます。たとえばここを参照してください。

あなたの場合、これは次のようになります。

pipeline {
    agent none
    stages {
        stage('Run Tests') {
            parallel {
                stage('Node1') {
                    agent {
                        label "specifice-label" // here node is selected
                    }
                    stages {
                         stage('Start') {  // this will run on the node selected above 
                              steps { 
                                 // fetch/compile/install/start JMeter
                              }
                         }
                         stage('Test') {  // this will run on the same node 
                              steps { 
                                 // run jmeter
                              }
                         }

                    }
                }
                stage('Node2') {
                    agent {
                        label "specifice-label" // this will select another node
                    }
                    // same as above 
                }
            }
        }
    }
}
于 2020-04-13T12:44:13.733 に答える