web-dev-qa-db-ja.com

マスターノードを含むラベルが割り当てられたすべてのJenkinsノードのリストを取得するにはどうすればよいですか?

Jenkinsパイプラインジョブを作成しています。特定のラベルが付いたすべてのノードでジョブを実行する必要があります。

したがって、特定のラベルが割り当てられたノード名のリストを取得しようとしています。 (ノードを使用すると、getAssignedLabels()でラベルを取得できます)

_jenkins.model.Jenkins.instance.nodes_のnodes- listに、検索に含める必要があるマスターノードが含まれていないようです。

現在の解決策は、_jenkins.model.Jenkins.instance.computers_を反復処理し、getNode()メソッドを使用してノードを取得することです。これは機能しますが、私が読んでいるJenkinsの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
}
_
13
Patrick B.

これが私が今やっているやり方です。他に何も見つかりませんでした:

@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には、マスターノードとすべてのスレーブが含まれています。

7
Patrick B.

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

3
k4cy

回答の更新:パイプラインで nodesByLabel を使用して、ラベルに割り当てられているすべてのノードを取得します。

1
towel

私はあなたがこれでこれを行うことができると思います:

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

これがクラウドノードで機能するかどうかはわかりません。

1
Russell Gallop

for (aSlave in hudson.model.Hudson.instance.slaves) {}aSlave.getLabelString());を使用して、すべてのノードのすべてのラベルを取得してください。この方法で、ラベルごとのノードのリストを作成できます。

0
kirkpatt