首页 文章

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

提问于
浏览
1

我需要为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

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

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

  • 1

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

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

    在您的Maven项目(pom.xml)中,使用以下属性配置插件,该插件需要节点名称: $

    以下是一些链接 - 如何远程触发Jenkins构建:

    如果可能的话,我不会这样做 . 但提供的信息应该可以帮助您找到解决方案 .

  • 0

    试试 Jenkins.getInstance().getComputer(env.NODE_NAME).getNode()official Doc上查看更多

  • 1

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

    • 为我插入Jenkens节点并构建一串要使用的服务器

    • 然后使用Dynamic Axis lable和我在Job 1中的列表来执行我的maven构建

    在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传递给我的下一份工作 . 所以我只是在Build过程中使用windows batc脚本将我想要的值写入属性文件

    echo serverNamesToExecuteSoapProjectOn=%serverNamesToExecuteSoapProjectOn%> baseEnvMap.properties
    

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

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

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

相关问题