web-dev-qa-db-de.com

Wie erhalte ich eine Liste aller Jenkins-Knoten, denen ein Label zugewiesen wurde, einschließlich des Masterknotens?

Ich erstelle einen Jenkins-Pipeline-Job und muss einen Job auf allen Knoten ausführen, die mit einem bestimmten Label gekennzeichnet sind.

Aus diesem Grund versuche ich, eine Liste der Knotennamen zu erhalten, denen eine bestimmte Bezeichnung zugewiesen wurde. (Mit einem Node bekomme ich die Labels mit getAssignedLabels())

Die nodes- Liste in jenkins.model.Jenkins.instance.nodes scheint nicht den Hauptknoten zu enthalten, den ich in meine Suche einbeziehen muss.

Meine derzeitige Lösung besteht darin, den jenkins.model.Jenkins.instance.computers zu durchlaufen und die getNode()- -Methode zu verwenden, um den Knoten zu erhalten. Dies funktioniert, aber im Javadoc von Jenkins lese ich, dass diese Liste möglicherweise nicht aktuell ist.

Langfristig werde ich (dynamisch) Cloud-Knoten hinzufügen und ich befürchte, dass ich dann computers nicht verwenden kann.

Was ist das Richtige, um die Liste aller aktuellen Knoten zu erhalten?

Das mache ich gerade:

@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
}
5
Patrick B.

So mache ich gerade. Ich habe nichts anderes gefunden:

@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 enthält den Master-Knoten und alle Slaves.

4
Patrick B.

Aktualisierte Antwort: Verwenden Sie in einer Pipeline nodesByLabel , um alle Knoten einer Bezeichnung zuzuweisen.

1
towel

Update auf @ patrick-b Antwort: Enthält möglicherweise Fehler, wenn Sie Labels mit derselben Zeichenfolge haben. Ich habe einen Split-Schritt hinzugefügt. Überprüfen Sie jedes mit Leerzeichen getrennte Label @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
k4cy

Ich denke, das kannst du mit:

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

Ich weiß nicht genau, ob dies mit Cloud-Knoten funktioniert.

0
Russell Gallop

Verwenden Sie for (aSlave in hudson.model.Hudson.instance.slaves) {} und aSlave.getLabelString());, um alle Labels für alle Knoten abzurufen. Sie können auf diese Weise eine Liste von Knoten pro Label erstellen.

0
kirkpatt