当前位置: 首页 > 知识库问答 >
问题:

如何在jenkins流水线的不同阶段分配具有特定标签的相同节点

杭镜
2023-03-14

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

  • 第1阶段:并行设置一些代理,例如获取源代码和测试,编译源代码和安装依赖项,将jmeter服务器作为守护进程运行,获取当前节点的IP地址。
  • 阶段2:在阶段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中的相同节点?如果另一个并发作业分配了一些在阶段 1 中设置了标签特定标签的节点,则管道将失败,因此阶段 2 将分配一些干净的节点并且无法运行测试。

我猜想,如果带有标签特定标签的节点数量超过管道所需的2个节点,那么在阶段1和阶段2中分配不同节点的概率可能会增加,并更频繁地导致管道故障。因此,我想知道编程语言中是否有类似lock的机制,可以锁定阶段1中的节点并保留节点以供阶段2使用。

谢了。

共有2个答案

萧献
2023-03-14

您可能希望检查声明性管道,其中任何没有明确要求节点的阶段都可以在分配给这些阶段的父节点的同一个节点上运行。例如,参见此处。

在您的情况下,这可能看起来像这样:

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 
                }
            }
        }
    }
}
宫俊才
2023-03-14

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

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

如果您需要更多的灵活性,您可以检查端口< code>1099(或者您通过< code>server_port属性指定的任何端口)是否空闲,如果不是,则已经有一个JMeter从属进程在该节点上运行。

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

 类似资料:
  • 我试图在jenkins管道中的不同节点上运行不同的阶段,比如第一阶段是签出,第二阶段是构建,第三阶段是单元测试。例如: 如果我尝试这样做,我的问题是如果我在Linux1节点中签出代码,那么当签出的代码在node1中时,为什么其他阶段可以在不同的节点中运行。 代码将如何分布,如果我的理解不正确,我如何实现并行,并确保每个阶段都可以并行并减少时间。 如果可能,请推荐任何用于编写Jenkins管道的gr

  • 我有一个多分支管道架构的以下Jenkinsfile 我试图在Ubuntu和Red Hat节点上并行运行“构建”阶段,而仅在Ubuntu节点上运行“测试”阶段。 任何人都可以帮助我指定如何选择在哪些节点上运行哪些阶段。我在网上找到的解决方案很少,但他们建议重写构建阶段两次:一次用于Red Hat节点,另一次用于Ubuntu节点。难道没有办法在没有代码重复的情况下做到这一点吗? 非常感谢

  • 我试图用JenkinsFile构建一个Jenkins声明性管道。Jenkinsfile将出现在项目的回购中。

  • 我正在使用普罗米修斯和格拉法纳,我正在试图跟踪一个web服务器应用程序。 我想以毫秒为单位绘制特定查询的平均持续时间。我想我可以从下面的数据到那里,但我在挣扎。 我的两组值: 但是分母可以有不同的返回码,所以我必须求和,我需要做一些忽略或on之类的事情,但我还没有找到一个例子来帮助我,我对此非常陌生。 有人吗?

  • 问题内容: 我有一个要解析的XML文件。XML是使用Excel通过Excel创建的 另存为XML 由于XML文件是从Microsoft Excel创建的,因此具有以下标头: 我尝试提取的数据按如下所示设置在块中: 现在,我的查询看起来像这样: 并给我这些结果: 我想将其分为4行,所以我会得到以下信息: 我尝试选择一个列作为 但是我只是得到了所有的价值。 有什么办法吗? XML文件的一般结构如下所示

  • 我有一个场景,其中有两个具有相同方法名称的不同标记。但它在Swagger编辑器中抛出了一个语法错误,称为“重复的映射键”。 在OpenAPI中编写此内容的正确方法是什么?