1

我需要在詹金斯管道的不同阶段分配相同的节点。场景是我需要运行分布式 JMeter 测试并创建一个管道,如下所示:

  • stage1:并行设置一些代理,例如获取源代码和测试,编译源并安装依赖项,将jmeter-server作为守护进程运行,获取当前节点的IP地址。
  • stage2:在stage1中分配相同的节点,使用一个节点作为JMeter主节点,将stage1中所有节点的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.
                }
            }
        }
    }
}

问题是如何确保stage2中分配的节点与stage1中的节点相同?如果另一个并发作业分配具有specific-label在 stage1 中设置的标签的一些节点,则管道将失败,因此 stage2 将分配一些干净的节点并且无法运行测试。

我猜想当带有标签的节点数量多于管道所需的 2 个节点时,在 stage1 和 stage2 中分配不同节点的概率可能会增加,specific-label并且更频繁地导致管道故障。所以我想知道是否有类似lock编程语言的机制可以锁定stage1中的节点并保留节点以供stage2使用。

谢谢。

4

2 回答 2

0

只需将节点的并发作业数量限制1为,一旦完成,“另一个并发作业”将排队,直到您当前的测试完成,反之亦然

Manage Jenkins > Nodes > specifice-label > Configure > # of executors

如果您需要更大的灵活性,您可以检查端口1099(或您通过server_portproperty指定的任何端口)是否空闲,如果没有 - 节点上已经有一个 JMeter Slave 进程正在运行。

更多信息:如何在 JMeter 中执行分布式测试

于 2020-04-13T08:47:55.143 回答
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 回答