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
}
_
これが私が今やっているやり方です。他に何も見つかりませんでした:
@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
を使用して、ラベルに割り当てられているすべてのノードを取得します。
私はあなたがこれでこれを行うことができると思います:
def nodes = Jenkins.instance.getLabel('my-label').getNodes()
for (int i = 0; i < nodes.size(); i++) {
node(nodes[i].getNodeName()) {
// on node
}
}
これがクラウドノードで機能するかどうかはわかりません。
for (aSlave in hudson.model.Hudson.instance.slaves) {}
とaSlave.getLabelString());
を使用して、すべてのノードのすべてのラベルを取得してください。この方法で、ラベルごとのノードのリストを作成できます。