【问题标题】:Jenkins - Is there a way to remove all offline nodes (slaves) / batch remove nodes / delete all nodes?Jenkins - 有没有办法删除所有离线节点(奴隶)/批量删除节点/删除所有节点?
【发布时间】:2014-06-06 00:26:23
【问题描述】:

使用 Jenkins Docker 插件时,可能由于错误,无法启动 swarms。我没有注意,目前我有数千个离线节点,但无法启动。

底线 - 有没有办法在 Jenkins 中批量删除节点(从站),清理所有离线节点,甚至删除所有节点?重新启动 Jenkins 服务器没有帮助,我在 Jenkins API 中找不到方法。

在我开始编写 Selenium 脚本或其他东西之前,任何想法都会很感激......

非常感谢!

【问题讨论】:

    标签: jenkins jenkins-plugins


    【解决方案1】:

    这是 Copy>Paste>Run 版本的 KeepCalmAndCarryOn 答案。 转到管理 Jenkins > 脚本控制台 > 复制并粘贴此代码 > 运行

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

    【讨论】:

    • 哈哈……他说渡渡鸟
    • 我必须在测试中通过aSlave.getComputer()?.isOffline()
    【解决方案2】:

    有这个script 有一个部分被注释掉以删除节点。

    它运行在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());
    }
    

    【讨论】:

    • 这个解决方案很好(从某种意义上说,如果有一个节点正在运行任何作业,那么它至少会首先将 SLAVE 节点标记为离线,然后等待作业完成),太棒了!但是如果我们在这里启用“删除”部分,就会出现问题,即如果任何从节点正在运行任何作业,那么所有这些作业都将被中止(这不好)。通过对该脚本进行更多的增强,我们可以使脚本足够智能以保持直到所有从站都空闲(在线/离线),然后优雅地删除它们。我会尽快发布答案。
    • 查看此处:stackoverflow.com/questions/34910485/… 以获得类似的解决方案
    【解决方案3】:

    感谢您的精彩回答。

    另一种方法是手动编辑“${JENKINS_HOME}/config.xml”文件(例如,通过正则表达式查找/替换)。

    【讨论】:

    • 我认为这不适用于 Jenkins v2.X。