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 构建?
例子
鉴于我有标签 'BackEndServers'
获取节点名称列表'Server1,Server2'
- 和运行我的工作为每个节点命名并向它传递一个参数
- 又名
- 有作业(带参数 Server1)
- 有作业(带参数 Server2)
在构建作业的 Maven 命令中使用 Jenkins environment variables,如 NODE_NAME 作为系统 属性 的值。例如:
mvn clean install -Djenkins.node.name=${NODE_NAME}
在您的 Maven 项目 (pom.xml) 中配置需要节点名称的插件,并借助以下 属性: ${jenkins.node.name}
这里有一些链接 - 如何远程触发 Jenkins 构建:
- How to trigger Jenkins builds remotely and to pass paramter
- Triggering builds remotely in Jenkins
- Launching a build with parameters
我不会,如果可以按照您想要的方式进行。但提供的信息应该可以帮助您找到解决方案。
最后我创建了 2 个工作。
- 为我查询 Jenkens 节点并建立一系列服务器以供使用
- 然后使用 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 的所有节点:
试试 Jenkins.getInstance().getComputer(env.NODE_NAME).getNode()
在 official Doc
上查看更多内容
我需要为 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 构建?
例子
鉴于我有标签 'BackEndServers'
获取节点名称列表'Server1,Server2'
- 和运行我的工作为每个节点命名并向它传递一个参数
- 又名
- 有作业(带参数 Server1)
- 有作业(带参数 Server2)
在构建作业的 Maven 命令中使用 Jenkins environment variables,如 NODE_NAME 作为系统 属性 的值。例如:
mvn clean install -Djenkins.node.name=${NODE_NAME}
在您的 Maven 项目 (pom.xml) 中配置需要节点名称的插件,并借助以下 属性: ${jenkins.node.name}
这里有一些链接 - 如何远程触发 Jenkins 构建:
- How to trigger Jenkins builds remotely and to pass paramter
- Triggering builds remotely in Jenkins
- Launching a build with parameters
我不会,如果可以按照您想要的方式进行。但提供的信息应该可以帮助您找到解决方案。
最后我创建了 2 个工作。
- 为我查询 Jenkens 节点并建立一系列服务器以供使用
- 然后使用 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 的所有节点:
试试 Jenkins.getInstance().getComputer(env.NODE_NAME).getNode()
在 official Doc