Jenkins/Hudson CLI API to modify the node labels using Groovy

前端 未结 3 1574
死守一世寂寞
死守一世寂寞 2021-02-20 03:13

Does anyone know how to modify the Jenkins/Hudson node labels in a non-manually way? I mean, thorough an API like the CLI API that this tool offers (without restarting Jenkins/H

相关标签:
3条回答
  • 2021-02-20 03:36

    Note: the other answers are a bit old, so it could be that the API has appeared since then.

    Node labels are accessed in the API as a single string, just like in the Configure screen.

    To read and write labels: Node.getLabelString() and Node.setLabelString(String).

    Note that you can get the effective labels as well via: Node.getAssignedLabels(), which returns a Collection of LabelAtom that includes dynamically computed labels such as the 'self-label' (representing the node name itself).

    Last, these methods on the Node class are directly accessible from the slave objects also, e.g. as a System Groovy Script:

    hudson = hudson.model.Hudson.instance
    hudson.slaves.findAll { it.nodeName.equals("slave4") }.each { slave -> 
      print "Slave  $slave.nodeName : Labels: $slave.labelString"
      slave.labelString = slave.labelString + " " + "offline"
      println "   --> New labels: $slave.labelString"
    }
    hudson.save()
    
    0 讨论(0)
  • 2021-02-20 03:36

    I've found a way to do this using the Groovy Postbuild Plugin.

    I have a Jenkins job that takes a few parameters (NodeToUpdate, LabelName, DesiredState) and executes this content in the Groovy Postbuild Plugin:

    nodeName = manager.envVars['NodeToUpdate']
    labelName = manager.envVars['LabelName']
    set = manager.envVars['DesiredState']
    
    for (node in jenkins.model.Jenkins.instance.nodes) {
        if (node.getNodeName().equals(nodeName)) {
            manager.listener.logger.println("Found node to update: " + nodeName)
            oldLabelString = node.getLabelString()
            if (set.equals('true')) {
                if (!oldLabelString.contains(labelName)) {
                    manager.listener.logger.println("Adding label '" + labelName     + "' from node " + nodeName);
                    newLabelString = oldLabelString + " " + labelName
                    node.setLabelString(newLabelString)
                    node.save()
                } else {
                    manager.listener.logger.println("Label '" + labelName + "' already exists on node " + nodeName)
                }
            }
            else {
                if (oldLabelString.contains(labelName)) {
                    manager.listener.logger.println("Removing label '" + labelName + "' from node " + nodeName)
                    newLabelString = oldLabelString.replaceAll(labelName, "")
                    node.setLabelString(newLabelString)
                    node.save()
                } else {
                    manager.listener.logger.println("Label '" + labelName + "' doesn't exist on node " + nodeName)
                }
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-20 03:54

    I've not seen a way yet to change the slave label either.

    I've taken to editing the main config.xml file and issuing a reload from the CLI.

    This has it's own problems though - any jobs currently running are lost until the next jenkins restart - see https://issues.jenkins-ci.org/browse/JENKINS-3265

    0 讨论(0)
提交回复
热议问题