代码之家  ›  专栏  ›  技术社区  ›  Ari Sweedler

Jenkins-如何使用2个代理运行单个阶段

  •  0
  • Ari Sweedler  · 技术社区  · 4 年前

    我有一个脚本,充当“测试驱动程序”(TD)。也就是说,它在“被测系统”(SUT)上驱动测试操作。当我运行测试框架脚本时( tfs.sh )在我的TD中,需要SUT作为参数。手动工作流如下所示:

    TD ~ $ ./tfs.sh --sut=<IP of SUT>
    

    我想要一个SUT集群(它们将有不同的操作系统,每个操作系统将重复几次)和一些TDs(比如,4或5,所以驾驶测试不会成为瓶颈,实际上执行它们会成为瓶颈)。


    我不知道用詹金斯原语来完成这个。我希望Jenkins阶段可以用两个代理调用。一个显然是TD,这就是实际运行脚本的部分。另一个是SUT。詹金斯将负责锁定和;像这样的资源争用。

    作为一种解决方法,我可以简单地让Jenkins完全不管理我的所有SUT,并手动实现SUT的锁定,这样两个不同的TDs就不会试图获取同一个。但是为什么要重新发明轮子呢?此外,我宁愿使用Jenkins插件来实现这一点,也不愿使用手动解决方案。


    我如何在2个(或更多)代理上运行一个Jenkins阶段?

    1 回复  |  直到 4 年前
        1
  •  1
  •   ycr    4 年前

    如果我正确理解了您的需求,您有一个静态SUT列表,您希望Jenkins通过为每个TD分配SUT来启动TDs。我假设TDs和SUT有一对一的关系。下面是一个非常简单的例子,说明如何实现您的需求。

    pipeline {
      agent any
      stages {        
          stage('parallel-run') {
                  steps {
                      script {
                          try {
                              def tests = getTestExecutionMap()
                              parallel tests
                          } catch (e) {
                              currentBuild.result = "FAILURE"
                          }
                      }
                  }
          }
      }
    }
    
    def getTestExecutionMap() {
        
        def tests = [:]
        def sutList = ["IP1", "IP2" , "IP3"]
    
        int count = 0
        for(String ip : sutList) {
          tests["TEST${count}"] = {
                node {
                    stage("TD with SUT ${ip}") {
                        script {
                            sh "./tfs.sh --sut=${ip}"
                        }
                    }
                }
            }
            count++
        }    
        return tests
    }
    

    enter image description here

    此外,如果您想选择要运行TD的代理。可以在节点块中指定代理的名称。 node(NAME) {...} . 您可以相应地改进代理选择标准。例如,您可以检查给定代理中有多少Jenkins执行器处于空闲状态,然后决定从那里开始多少TDs。