Jenkins:如何从标签中获取节点名称以用作参数

Jenkins: How to get node name from label to use as a parameter

我需要为 Maven 构建提供服务器名称。在 Maven 构建期间,此服务器名称将用于调用该服务器在该服务器上进行一些测试。

我们的服务器上有 jenkins slaves,并使用标签分组

例子

Slaves/Node |  Label

Server1     |  BackEndServers

Server2     |  BackEndServers

Server3     |  FrontEndServers

Server4     |  FrontEndServers

使用 Elastic Axis 插件,我可以说 运行 我的 Jenkins 作业在此节点标签上(例如在 BackEndServers 上),同一个项目将在两个服务器(Server1 和 Server2)上执行。

在我的情况下,我无法执行此操作,因为我的代码是 运行ning 的 BackEndServers 上未安装 Maven。但是 Maven 构建需要知道服务器名称。

那么有没有一种方法可以让我从标签中获取服务器名称,然后 运行 同一个作业多次将每个服务器名称传递给 maven 构建?

例子

在构建作业的 Maven 命令中使用 Jenkins environment variables,如 NODE_NAME 作为系统 属性 的值。例如:

 mvn clean install -Djenkins.node.name=${NODE_NAME}

在您的 Maven 项目 (pom.xml) 中配置需要节点名称的插件,并借助以下 属性: ${jenkins.node.name}

这里有一些链接 - 如何远程触发 Jenkins 构建:

  1. How to trigger Jenkins builds remotely and to pass paramter
  2. Triggering builds remotely in Jenkins
  3. Launching a build with parameters

我不会,如果可以按照您想要的方式进行。但提供的信息应该可以帮助您找到解决方案。

最后我创建了 2 个工作。

  1. 为我查询 Jenkens 节点并建立一系列服务器以供使用
  2. 然后使用 Dynamic Axis 标签和我在作业 1 中的列表来执行我的 maven 构建

在作业 1 中 - 我使用了 EnjEnv 插件,它有一个 'Evaludated Groovy Script' 部分,基本上你可以做任何事情......但它应该 return 一个 属性 地图。我不知道如何从 Groovy 脚本中 return 一个值,所以这对我有用,因为我几乎可以从任何软件 属性 (或环境变量)引用

import hudson.model.*

String labelIWantServersOf = TheLabelUsedOnTheElasticAxisPlugin; // This is the label assosiated with nodes for which i want the server names of
String serverList = '';

for (aSlave in hudson.model.Hudson.instance.slaves) {          
  out.println('Evaluating Server(' + aSlave.name + ') with label = ' + aSlave.getLabelString());  

  if (aSlave.getLabelString().indexOf(labelIWantServersOf ) > -1) {
    serverList += aSlave.name + ' ';        
    out.println('Valid server found: ' + aSlave.name);                  
  }    

}

out.println('Final server list where SOAP projects will run on = ' + serverList + ' which will be used in the environment envInject map');

Map<String, String> myMap = new HashMap<>(2);
myMap.put("serverNamesToExecuteSoapProjectOn", serverList );
return myMap;

然后我在将环境变量传递给我的下一份工作时遇到了一些问题。所以我只是在构建过程中使用 windows batc 脚本将我想要的值写入 属性 文件

echo serverNamesToExecuteSoapProjectOn=%serverNamesToExecuteSoapProjectOn%> baseEnvMap.properties

然后作为 post 构建操作,我有一个“在其他项目上触发参数化构建”调用我的第二个作业,我将 baseEnvMap.properties 传递给它。

然后在我的作业 2 上,这是一个多配置作业,我使用通过 属性 文件传递​​给作业 2 的环境变量添加了一个动态轴。

这将复制作业 2 并每次使用 groovy 脚本构建的值执行它,我可以在我的 mvn 参数中引用它。

列出标签名称 LABELNAME 的所有节点:

http://ServerIP:8080/label/LABELNAME/api/json?pretty=true

试试 Jenkins.getInstance().getComputer(env.NODE_NAME).getNode()official Doc

上查看更多内容