以编程方式切换Jenkins奴隶的在线状态

时间:2017-12-13 08:09:21

标签: jenkins jenkins-pipeline

切换Jenkins奴隶在线状态的最佳程序是什么? 奴隶的JSON api提供:

  • 离线
  • temporarilyOffline

假设a job won't be assigned to a slave unless both those fields are false是否正确?

我一直在做的是:

1)将slave切换到temporaryOffline = true

2)启动从属机器

3)使用/ launchSlaveAgent POST调用启动代理

4)等待代理连接

5)将slave切换到temporaryOffline = false

6)定期检查从机是否空闲,如果是,则切换临时禁用=真,检查是否仍处于空闲状态,以及它是否正在关闭从机

大部分时间都可以使用。 有时虽然我遇到了分配给奴隶的工作,然后失败了:

Cannot contact slave1: java.io.IOException: remote file operation failed: /home/jenkins/workspace/Somejob at hudson.remoting.Channel@67acbe03:slave1: hudson.remoting.ChannelClosedException: Remote call on slave1 failed. The channel is closing down or has closed down

或类似。

我暂时将作业标记为离线,这样如果它与代理连接,它将停止接受新作业,我可以安全地关闭机器。从站启动并通过代理连接到主站时,而不是关闭时,会出现问题。

这种方法有什么明显的问题吗?特别是,在步骤4),如果设置了从属temporarilyOffline = true,那么即使代理实际连接,offline似乎也保持正确。因此,步骤4)包括查看从控制台并搜索成功连接的字符串消息(yuk)。

我想如果我将奴隶设置为temporarilyOffline = false,那么如果我启动代理,那么只要代理成功连接,offline字段就应切换到false。< / p>

我可以切换到这种方法,但仍然没有解释为什么会发生异常,特别是我没有得到的是为什么如果代理没有正确连接就将作业分配给奴隶(如,offline标志仍应为false,不应将作业分配给它。)

编辑:我已经确定了该特定实例中发生的情况。 代理将声明与Agent successfully connected and online连接,但在它添加以下日志之后立即:

null
ERROR: Unexpected error in launching a slave. This is probably a bug in Jenkins.
java.lang.NullPointerException
    at hudson.plugins.sshslaves.SSHLauncher.isRecoverable(SSHLauncher.java:1332)
    at hudson.plugins.sshslaves.SSHLauncher.openConnection(SSHLauncher.java:1302)

因此,如果Agent successfully connected and online上的检查发生在null之前,并且其余的堆栈跟踪将被打印出来,则会认为代理已成功连接并在线切换从属设备。

要解决此问题,一旦脚本识别出代理连接已被连接,它将等待x个额外秒并重新检查,并且如果第二次检查失败,则不会在线切换从属设备。

现在突出的问题是“NullPointerException发生的原因&#39;?

0 个答案:

没有答案