2014-06-06 24 views
6

Büyük olasılıkla bir hata nedeniyle Jenkins Docker Eklentisini kullanırken, sürüleri başlatılamıyor. Dikkat etmedim ve şu anda başlatılamayan binlerce çevrimdışı düğümüm var.Jenkins - Tüm çevrimdışı düğümleri (slave)/toplu kaldırma düğümlerini/tüm düğümleri silmenin bir yolu var mı?

BOTTOM LINE - Jenkin'teki düğümleri (slave'ler) toplu olarak kaldırmak, tüm çevrimdışı düğümleri temizlemek ve hatta tüm düğümleri silmek için bir yol var mı? Jenkins sunucusunun yeniden düzenlenmesi yardımcı olmadı ve Jenkins API'sinde bir yol bulamadım. Bir Selenyum senaryo falan yazmaya başlıyorum önce

...

çok teşekkür ederiz bir fikrin takdir Will!

cevap

11

script bir bölüm var, düğümleri silmek için yorum yaptı.

O büyük cevap 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

Bu çözüm (iyi anlamda o zaman, bunu herhangi bir iş (ler) çalıştıran bir düğüm varsa 'en azından ilk önce SLAVE düğümünü OFFLINE olarak işaretleyin ve ardından işlerin tamamlanmasını bekleyin. Ancak "DELETE" kısmını burada etkinleştirirsek, bir sorun vardır, yani herhangi bir slave düğümü herhangi bir JOB (s) çalıştırıyorsa, bu işlerin tümü iptal edilir (bu iyi değildir). Bu betikte biraz daha fazla geliştirmeler yapılarak, betiğin tüm slave'leri ücretsiz (çevrimiçi/çevrimdışı) ücretsiz hale gelinceye kadar akıllı hale getirebiliriz ve daha sonra bunları zarif bir şekilde sileriz. Cevabı kısa bir süre sonra göndereceğim. –

+0

Bakın: http://stackoverflow.com/questions/34910485/block-a-job-from-running-if-given-nodes-with-a-given-labels-is-are-running-a benzer bir çözüm –

0

teşekkür çalışır.

Bunu yapmanın başka bir yolu '$ {JENKINS_HOME} /config.xml' dosyasını elle düzenlemek ve (örneğin regex ile bul/değiştir) elle yapmaktır.

+0

Bunun bence Jenkins v2.X için geçerli değil. – vikas027

0

Bu, KeepCalmAndCarryOn yanıtının Copy>Paste>Run sürümüdür. Git Çalıştır> bu kodu yapıştırın> Jenkins> Senaryo Konsolu & kopya yönetmek için

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… dodo dedi – Clintm

İlgili konular