【问题标题】:Jenkins/Hudson CLI API to modify the node labels using GroovyJenkins/Hudson CLI API 使用 Groovy 修改节点标签
【发布时间】:2012-01-11 17:05:52
【问题描述】:

有谁知道如何以非手动方式修改 Jenkins/Hudson 节点标签?我的意思是,彻底了解此工具提供的 CLI API 之类的 API(当然无需重新启动 Jenkins/Hudson)。

我的猜测是最好的选择是使用 Groovy 脚本进入 Jenkins/Hudson 的胆量。执行类似:

java -jar -s HUDSON_URL:8080 groovy /path/to/groovy.groovy

作为该脚本的内容,类似于:

for (aSlave in hudson.model.Hudson.instance.slaves) {
   labels = aSlave.getAssignedLabels()
   println labels
   **aSlave.setLabel("blabla")** // this method doesn't exist, is there any other way???
}

提前致谢!

维克多

【问题讨论】:

    标签: java groovy hudson jenkins


    【解决方案1】:

    注意:其他答案有点老了,所以可能是从那时起API就出现了。

    在 API 中以单个字符串的形式访问节点标签,就像在配置屏幕中一样。

    读取和写入标签:Node.getLabelString()Node.setLabelString(String)

    请注意,您也可以通过以下方式获取有效标签:Node.getAssignedLabels(),它返回一个 LabelAtom 集合,其中包括动态计算的标签,例如“自标签”(表示节点名称本身)。

    最后,Node 类上的这些方法也可以从从属对象直接访问,例如作为系统 Groovy 脚本:

    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()
    

    【讨论】:

    • 我将如何以及在何处运行此脚本?最后似乎还有一个额外的}。
    • 不过,这些更改似乎不会持续存在。
    • hudson.model.Hudson.instance.save()
    • 我不知道 Groovy,但这个 sn-p 似乎仍然肯定是错误的 - 具有无与伦比的 } 并且不能在 Jenkins 中运行。
    • 这个脚本还是有问题的:它修改了all个slave的标签,而不是只使用slave4
    【解决方案2】:

    我找到了一种使用 Groovy Postbuild 插件的方法。

    我有一个 Jenkins 作业,它需要一些参数(NodeToUpdate、LabelName、DesiredState)并在 Groovy Postbuild 插件中执行此内容:

    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)
                }
            }
        }
    }
    

    【讨论】:

    • 非常感谢!帮我很多!完美无误。
    【解决方案3】:

    我还没有看到改变从属标签的方法。

    我已经开始编辑主 config.xml 文件并从 CLI 发出重新加载。

    这有它自己的问题 - 当前运行的任何作业都会丢失,直到下一次 jenkins 重新启动 - 请参阅 https://issues.jenkins-ci.org/browse/JENKINS-3265

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2014-06-14
      相关资源
      最近更新 更多