如何获取分配了包含主节点的标签的所有Jenkins节点的列表?

问题描述 投票:7回答:5

我正在创建一个Jenkins管道作业,我需要在标有某个标签的所有节点上运行作业。

因此,我正在尝试获取分配了特定标签的节点名称列表。 (使用节点我可以使用getAssignedLabels()获取标签)

nodes中的jenkins.model.Jenkins.instance.nodes列表似乎不包含我需要在搜索中包含的主节点。

我目前的解决方案是迭代jenkins.model.Jenkins.instance.computers并使用getNode()方法获取节点。这是有效的,但在詹金斯的javadoc我正在阅读这个列表可能不是最新的。

从长远来看,我将添加(动态)云节点,我担心我将无法使用computers

什么是正确获取所有当前节点的列表?

这就是我现在正在做的事情:

@NonCPS
def nodeNames(label) {
    def nodes = []
    jenkins.model.Jenkins.instance.computers.each { c ->
        if (c.node.labelString.contains(label)) {
            nodes.add(c.node.selfLabel.name)
        }
    }   
    return nodes
}
jenkins jenkins-pipeline jenkins-groovy
5个回答
6
投票

这就是我现在正在做的事情。我还没找到别的东西:

@NonCPS
def hostNames(label) {
  def nodes = []
  jenkins.model.Jenkins.instance.computers.each { c ->
    if (c.node.labelString.contains(label)) {
      nodes.add(c.node.selfLabel.name)
    }
  }
  return nodes
}

jenkins.model.Jenkins.instance.computers包含主节点和所有从节点。


2
投票

更新到@ patrick -b回答:如果你有包含相同字符串的标签,则包含可能有错误,我添加了拆分步骤请检查用空格分隔的每个标签 @NonCPS def hostNames(label) { def nodes = [] jenkins.model.Jenkins.instance.computers.each { c -> c.node.labelString.split(' ').each { l -> if (l != null && l.equals(label)) { nodes.add(c.node.selfLabel.name) } } } return nodes }


1
投票

更新的答案:在管道中使用nodesByLabel将所有节点分配给标签。


0
投票

尝试使用for (aSlave in hudson.model.Hudson.instance.slaves) {}aSlave.getLabelString());获取所有节点的所有标签。您可以通过这种方式构建每个标签的节点列表。


0
投票

我认为你可以这样做:

def nodes = Jenkins.instance.getLabel('my-label').getNodes()
for (int i = 0; i < nodes.size(); i++) {
    node(nodes[i].getNodeName()) {
        // on node
    }
}

我不确定这是否适用于云节点。

© www.soinside.com 2019 - 2024. All rights reserved.