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

时间:2015-02-05 10:03:27

标签: maven parameters jenkins jenkins-plugins

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

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

实施例

Slaves/Node |  Label

Server1     |  BackEndServers

Server2     |  BackEndServers

Server3     |  FrontEndServers

Server4     |  FrontEndServers

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

在我的情况下,我不能这样做,因为我的代码运行的BackEndServers上没有安装maven。但是maven构建需要知道服务器名称。

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

实施例

  • 给我标签'BackEndServers'

  • 获取节点名称'Server1,Server2'

  • 的列表
  • 并为每个节点名称运行我的作业并将参数传递给它
  • 又名
    • 有工作(带参数Server1)
    • 有工作(带参数Server2)

4 个答案:

答案 0 :(得分:1)

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

 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
  4. 如果可能的话,我不会这样做。但提供的信息可以帮助您找到解决方案。

答案 1 :(得分:1)

尝试Jenkins.getInstance().getComputer(env.NODE_NAME).getNode()进一步了解official Doc

答案 2 :(得分:0)

最后我创造了2个工作岗位。

  1. 为我插入Jenkens节点并构建一串服务器以供使用
  2. 然后使用Dynamic Axis lable和我在Job 1中的列表来执行我的maven build
  3. 在Job 1中 - 我使用了EnjEnv插件,它有一个'Evaludated Groovy Script'部分,基本上你可以做任何事情......但它应该返回一个属性映射。我不知道如何从Groovy脚本返回一个值,所以这对我来说很有用,因为我可以从几乎任何软件中引用属性(或环境变量)

    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;
    

    然后我有一些问题将Environment var传递给我的下一份工作。所以我只是在构建过程

    中使用windows batc脚本将我想要的值写入属性文件
    echo serverNamesToExecuteSoapProjectOn=%serverNamesToExecuteSoapProjectOn%> baseEnvMap.properties
    

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

    然后在作为Multiconfig作业的Job 2上,我使用通过属性文件传递给作业2的环境var添加了动态轴。

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

答案 3 :(得分:0)

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

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