我正在创建一个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
}
这就是我现在正在做的事情。我还没找到别的东西:
@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
包含主节点和所有从节点。
更新到@ 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
}
更新的答案:在管道中使用nodesByLabel
将所有节点分配给标签。
尝试使用for (aSlave in hudson.model.Hudson.instance.slaves) {}
和aSlave.getLabelString());
获取所有节点的所有标签。您可以通过这种方式构建每个标签的节点列表。
我认为你可以这样做:
def nodes = Jenkins.instance.getLabel('my-label').getNodes()
for (int i = 0; i < nodes.size(); i++) {
node(nodes[i].getNodeName()) {
// on node
}
}
我不确定这是否适用于云节点。