2012-01-11 3 views
6

¿Alguien sabe cómo modificar las etiquetas de nodo Jenkins/Hudson de forma no manual? Me refiero a una API completa como la API CLI que ofrece esta herramienta (sin reiniciar Jenkins/Hudson, por supuesto).Jenkins/Hudson CLI API para modificar las etiquetas de nodo utilizando Groovy

Supongo que la mejor opción es usar una secuencia de comandos Groovy para ingresar a las entrañas de Jenkins/Hudson. Ejecutar algo como:

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

Siendo el contenido de ese guión algo como:

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

Gracias de antemano!

Victor

Respuesta

1

no he visto una forma todavía para cambiar la etiqueta de esclavos tampoco.

He decidido editar el archivo config.xml principal y emitir una recarga desde la CLI.

Esto tiene sus problemas propios, aunque - ninguna tarea en ejecución actualmente se pierden hasta las próximas Jenkins reinician - ver https://issues.jenkins-ci.org/browse/JENKINS-3265

4

Nota: las otras respuestas son un poco viejo, así que podría ser que la API ha aparecido desde entonces .

Se accede a las etiquetas de nodo en la API como una sola cadena, al igual que en la pantalla Configurar.

Para leer y escribir etiquetas: Node.getLabelString() y Node.setLabelString(String).

Tenga en cuenta que también puede obtener las etiquetas eficaces a través de: Node.getAssignedLabels(), que devuelve una Colección de LabelAtom que incluye etiquetas calculadas dinámicamente como la 'auto-etiqueta' (que representa el nombre del nodo en sí).

Por último, estos métodos en la clase Node son directamente accesibles desde los objetos esclavos también, p. Ej. como un script de Groovy del sistema:

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

¿Cómo y dónde habría que ejecutar este script? También parece que hay un extra} al final. –

+0

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

+1

No obstante, no parece que estos cambios persistan. –

0

He encontrado una forma de hacerlo utilizando el complemento Groovy Postbuild.

tengo un trabajo Jenkins que lleva unos parámetros (NodeToUpdate, LabelName, DesiredState) y ejecuta este contenido en el maravilloso 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) 
      } 
     } 
    } 
} 
Cuestiones relacionadas