2014-06-06 18 views
6

Durante l'utilizzo del plugin Docker di Jenkins, probabilmente a causa di un errore, non è possibile avviare sciami. Non ho prestato attenzione e al momento ho migliaia di nodi offline, che non sono stati avviati.Jenkins: esiste un modo per rimuovere tutti i nodi non in linea (slave)/eliminare i nodi in batch/eliminare tutti i nodi?

BOTTOM LINE - Esiste un modo per rimuovere i nodi (slave) in Jenkin, pulire tutti i nodi offline o persino eliminare tutti i nodi? Il ripristino del server Jenkins non è stato di aiuto e non sono riuscito a trovare un modo nell'API Jenkins.

apprezzeranno qualsiasi idea, prima che io sto iniziando a scrivere uno script di selenio o qualcosa del genere ...

Molte grazie!

risposta

11

C'è questo script con una sezione commentata per eliminare i nodi.

Vizio di Jenkins script console

for (aSlave in hudson.model.Hudson.instance.slaves) { 
    println('===================='); 
    println('Name: ' + aSlave.name); 
    println('getLabelString: ' + aSlave.getLabelString()); 
    println('getNumExectutors: ' + aSlave.getNumExecutors()); 
    println('getRemoteFS: ' + aSlave.getRemoteFS()); 
    println('getMode: ' + aSlave.getMode()); 
    println('getRootPath: ' + aSlave.getRootPath()); 
    println('getDescriptor: ' + aSlave.getDescriptor()); 
    println('getComputer: ' + aSlave.getComputer()); 
    println('\tcomputer.isAcceptingTasks: ' + aSlave.getComputer().isAcceptingTasks()); 
    println('\tcomputer.isLaunchSupported: ' + aSlave.getComputer().isLaunchSupported()); 
    println('\tcomputer.getConnectTime: ' + aSlave.getComputer().getConnectTime()); 
    println('\tcomputer.getDemandStartMilliseconds: ' + aSlave.getComputer().getDemandStartMilliseconds()); 
    println('\tcomputer.isOffline: ' + aSlave.getComputer().isOffline()); 
    println('\tcomputer.countBusy: ' + aSlave.getComputer().countBusy()); 
    //if (aSlave.name == 'NAME OF NODE TO DELETE') { 
    // println('Shutting down node!!!!'); 
    // aSlave.getComputer().setTemporarilyOffline(true,null); 
    // aSlave.getComputer().doDoDelete(); 
    //} 
    println('\tcomputer.getLog: ' + aSlave.getComputer().getLog()); 
    println('\tcomputer.getBuilds: ' + aSlave.getComputer().getBuilds()); 
} 
+0

Questa soluzione è buona (nel senso che se c'è un nodo che esegue qualsiasi lavoro (s), allora 'Per lo meno prima contrassegnare il nodo SLAVE come OFFLINE e quindi attendere il/i lavoro/i da completare), ottimo! Ma se abilitiamo qui la parte "DELETE", allora c'è un problema, ad esempio se uno qualsiasi dei nodi slave sta eseguendo qualsiasi JOB, allora tutti questi lavori verranno interrotti (il che non è buono). Con un po 'più di miglioramento di questo script, possiamo rendere lo script abbastanza intelligente da TENERE ATTIVO finché tutti gli slave non sono gratuiti (sia online che offline) e quindi cancellarli con garbo. Pubblicherò la risposta a breve. –

+0

Vedi qui: http://stackoverflow.com/questions/34910485/block-a-job-from-running-if-given-nodes-with-a-given-labels-is-are-running-a per un analogo soluzione –

0

Grazie per la grande risposta.

Un altro modo per farlo è modificare manualmente il file "$ {JENKINS_HOME} /config.xml" (e trovare/sostituire con espressioni regolari, ad esempio).

+0

Non penso che questo si applica a Jenkins v2.X. – vikas027

0

Questa è la versione Copy>Paste>Run di KeepCalmAndCarryOn. Vai a gestire Jenkins> Console Script> copia & incolla questo codice> Esegui

for (aSlave in hudson.model.Hudson.instance.slaves) { 
    if (aSlave.getComputer().isOffline()) { 
     aSlave.getComputer().setTemporarilyOffline(true,null); 
     aSlave.getComputer().doDoDelete(); 
    } 
} 

enter image description here

+0

ha ... ha detto dodo – Clintm

Problemi correlati