2012-01-11 50 views
6

有誰知道如何以非手動方式修改Jenkins/Hudson節點標籤嗎?我的意思是,通過API工具提供的CLI API(當然,無需重新啓動Jenkins/Hudson)。Jenkins/Hudson CLI API使用Groovy修改節點標籤

我的猜測是最好的選擇是使用Groovy腳本進入Jenkins/Hudson膽量。執行類似:

Java的罐子-s HUDSON_URL: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自那以來出現。

節點標籤在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

如何,我會在哪裏運行此腳本?最後還有一個額外的}。 – 2014-03-13 18:38:19

+0

https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+Script+Console – 2014-03-13 18:44:25

+1

儘管如此,這些更改仍未出現。 – 2014-03-16 19:26:21

0

我發現了一種使用Groovy Postbuild插件的方法。

我有詹金斯作業需要幾個參數(NodeToUpdate,標籤,DesiredState)並執行Groovy的Postbuild插件此內容:

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