首页 > 解决方案 > Jenkins Pipeline:如何为单个测试分配多个节点 - 分布式测试编排

问题描述

这不是一个正常的“在许多奴隶上运行这项工作”的问题!

千篇一律的答案是行不通的。

用例

我正在尝试使用 Jenkins 流水线对涉及一个“客户端”和许多“服务器”的分布式软件进行测试,方法是为这些角色分配 Jenkins 从站,在从站上运行组件,然后将其全部拆除。我们可以假设“服务器”将运行 Web 服务器,而“客户端”对它们运行“wget”。

注意事项

我正在使用脚本化管道(不是声明性的)。本质上,当我在“客户端”节点上运行客户端逻辑时,我需要所有“服务器”都启动。

显然顺序node{}块不起作用,因为我需要所有从属服务器同时启动。并行可能工作,我对这个选项持开放态度,但似乎很难调试。

我的解决方案

所以这是我到目前为止提出的。这是一个简化的例子,可能在每个节点关闭之后(设置每个服务器)和每个节点关闭接近尾声(清理每个服务器)都有逻辑,或者都可以由客户端完成,无所谓.

def allocatedServerList = []
// Allocate 3 "servers" and then 1 client. Keep servers allocated.
node {
   allocatedServerList << env.NODE_NAME
   node {
      allocatedServerList << env.NODE_NAME
      node {
         allocatedServerList << env.NODE_NAME
         node {
            //this is the client
            sh "run some client work against ${allocatedServerList}"
            //eg: ssh to each server, start some service, pound it for a while, shut them down
         }
      }
   }
}

令人惊讶的是,这很好用。

任何人都可以提出更好的方法吗?嵌套代码的缺点是您无法轻松更改节点的数量(没有递归方法,这使得它不可读)

标签: jenkinsgroovyjenkins-pipeline

解决方案


要在所有节点上运行,您可以使用以下内容:

在所有节点上触发作业

该示例展示了如何从 Pipeline 触发所有 Jenkins 节点上的作业。

摘要: * 该脚本使用 NodeLabel 参数插件将作业名称传递给有效负载作业。* 节点列表检索是使用 Jenkins API 执行的,因此需要在沙盒模式下获得脚本批准 要查看 jenkins.io 中的此示例,请访问:Trigger Job On All Nodes


推荐阅读