2012-01-11 10 views
6

Qualcuno sa come modificare le etichette del nodo Jenkins/Hudson in modo non manuale? Voglio dire, approfondire un'API come l'API CLI che questo strumento offre (senza riavviare Jenkins/Hudson ovviamente).API Jenkins/Hudson CLI per modificare le etichette del nodo utilizzando Groovy

La mia ipotesi è che l'opzione migliore è usare uno script Groovy per entrare nell'intestino di Jenkins/Hudson. L'esecuzione di qualcosa di simile a:

java-jar -s HUDSON_URL: 8080 Groovy /path/to/groovy.groovy

Essendo il contenuto di tale scritto qualcosa come:

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

Grazie in anticipo!

Victor

risposta

1

non ho ancora visto un modo per cambiare l'etichetta schiava sia.

Ho preso a modificare il file config.xml principale ed emettere un ricarico dalla CLI.

Questo ha i suoi problemi però - tutti i processi attualmente in esecuzione sono persi fino alla prossima Jenkins riavviare - vedi https://issues.jenkins-ci.org/browse/JENKINS-3265

4

Nota: le altre risposte sono un po 'vecchio, quindi potrebbe essere che l'API è apparsa da allora .

Le etichette dei nodi sono accessibili nell'API come una singola stringa, proprio come nella schermata Configura.

Per leggere e scrivere etichette: Node.getLabelString() e Node.setLabelString(String).

Si noti che è possibile ottenere anche le etichette effettive tramite: Node.getAssignedLabels(), che restituisce una raccolta di LabelAtom che include etichette calcolate dinamicamente come "auto-etichetta" (che rappresenta il nome del nodo stesso).

Infine, questi metodi sulla classe Node sono direttamente accessibili anche dagli oggetti slave, ad es. come script di sistema 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

Come e dove dovrei eseguire questo script? Inoltre sembra che ci sia un extra} alla fine. –

+0

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

+1

Tuttavia, non sembra che queste modifiche persistano. –

0

Ho trovato un modo per farlo utilizzando il Groovy Postbuild Plugin.

ho un lavoro Jenkins che prende un paio di parametri (NodeToUpdate, LabelName, DesiredState) ed esegue questo contenuto nel Groovy Postbuild Plugin:

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