2012-01-11 11 views
6

Jenkins/Hudsonノードのラベルを非手動で変更する方法を知っている人はいますか?つまり、Jenkins/Hudsonを再起動することなく、このAPIが提供するCLI APIのようなAPIを徹底しています。Jenkins/Hudson CLI APIを使用してGroovyを使用してノードラベルを変更する

私の推測では、最良の選択肢は、Jenkins/Hudsonの腸に入るためにGroovyスクリプトを使用していると思います。 HUDSON_URLを-s -jar

のjava:8080グルーヴィー/path/to/groovy.groovy

のような、そのスクリプトに何かの内容ビーイング:事前に

for (aSlave in hudson.model.Hudson.instance.slaves) { 
    labels = aSlave.getAssignedLabels() 
    println labels 
    **aSlave.setLabel("blabla")** // this method doesn't exist, is there any other way??? 
} 

おかげのようなものを実行!

ビクター

答えて

1

まだスレーブラベルを変更する方法はありません。

メインのconfig.xmlファイルを編集し、CLIからリロードを発行しました。

これは、それはしかし自身の問題だ持っている - 次ジェンキンスが再起動するまでは、現在実行中のすべてのジョブが失われる - https://issues.jenkins-ci.org/browse/JENKINS-3265

4

参照してください。注:他の回答は少し古いですので、APIはそれ以来登場していることが考えられ。

ノードラベルは、Configure画面と同様に、API内で単一の文字列としてアクセスされます。

ラベルを読み書きするにはNode.getLabelString()Node.setLabelString(String)です。

有効ラベルはNode.getAssignedLabels()で取得できます。このラベルは、「自己ラベル」(ノード名自体を表す)などの動的に計算されたラベルを含むLabelAtomのコレクションを返します。

最後に、Nodeクラスのこれらのメソッドは、スレーブオブジェクトから直接アクセスできます。システムGroovyスクリプトとして:

hudson = hudson.model.Hudson.instance 
hudson.slaves.findAll { it.nodeName.equals("slave4") }.each { slave -> 
    print "Slave $slave.nodeName : Labels: $slave.labelString" 
    slave.labelString = slave.labelString + " " + "offline" 
    println " --> New labels: $slave.labelString" 
} 
hudson.save() 
+0

どのように、どこで、私はこのスクリプトを実行するのでしょうか?また、最後に余分な}があるように見えます。 –

+0

https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+Script+Console –

+1

これらの変更はそのままでは表示されません。 –

0

私はGroovy Postbuild Pluginを使ってこれを行う方法を見つけました。

私はいくつかのパラメータ(NodeToUpdate、ラベル名、DesiredState)を取り、Groovyのポストビルドプラグインでこの内容を実行ジェンキンス仕事をしている:

nodeName = manager.envVars['NodeToUpdate'] 
labelName = manager.envVars['LabelName'] 
set = manager.envVars['DesiredState'] 

for (node in jenkins.model.Jenkins.instance.nodes) { 
    if (node.getNodeName().equals(nodeName)) { 
     manager.listener.logger.println("Found node to update: " + nodeName) 
     oldLabelString = node.getLabelString() 
     if (set.equals('true')) { 
      if (!oldLabelString.contains(labelName)) { 
       manager.listener.logger.println("Adding label '" + labelName  + "' from node " + nodeName); 
       newLabelString = oldLabelString + " " + labelName 
       node.setLabelString(newLabelString) 
       node.save() 
      } else { 
       manager.listener.logger.println("Label '" + labelName + "' already exists on node " + nodeName) 
      } 
     } 
     else { 
      if (oldLabelString.contains(labelName)) { 
       manager.listener.logger.println("Removing label '" + labelName + "' from node " + nodeName) 
       newLabelString = oldLabelString.replaceAll(labelName, "") 
       node.setLabelString(newLabelString) 
       node.save() 
      } else { 
       manager.listener.logger.println("Label '" + labelName + "' doesn't exist on node " + nodeName) 
      } 
     } 
    } 
}