jenkins-cli 构建触发器连接超时 运行 作业

jenkins-cli build trigger connection times out for long running jobs

我使用 udeploy Shell 步骤中的 followig 命令来调用 Jenkins 作业。我需要等待作业完成,然后继续在 udeploy 中执行进一步的步骤。

无论我是直接从服务器上的 shell 还是从 Udeploy 中的 Shell 步骤调用 jenkins 作业,问题都是一样的。

命令:- java -jar jenkins-cli.jar -s -remoting build -s --username --password ''

短 运行 作业的输出(几分钟)

Aug 03, 2018 3:55:09 PM hudson.cli.CLI _main
WARNING: Failed to authenticate with your SSH keys. Proceeding as anonymous
Started Job » SleepJob #4
Completed Job #4 : SUCCESS

长 运行 作业的输出(不确定它到底在哪里失败,但已经注意到这个作业 运行 一个小时) *詹金斯的工作完成得很好 *返回到shell的状态是这个

Aug 03, 2018 11:42:53 AM hudson.cli.CLI _main
WARNING: Failed to authenticate with your SSH keys. Proceeding as anonymous
Started Job #1
Aug 03, 2018 1:54:36 PM hudson.remoting.SynchronousCommandTransport$ReaderThread run
SEVERE: I/O error in channel CLI connection to <URL>
java.net.SocketException: Connection timed out (Read failed)
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at java.io.FilterInputStream.read(FilterInputStream.java:133)
        at java.io.FilterInputStream.read(FilterInputStream.java:107)
        at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:114)
        at javax.crypto.CipherInputStream.read(CipherInputStream.java:239)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
        at hudson.remoting.FlightRecorderInputStream.read(FlightRecorderInputStream.java:91)
        at hudson.remoting.ChunkedInputStream.readHeader(ChunkedInputStream.java:72)
        at hudson.remoting.ChunkedInputStream.readUntilBreak(ChunkedInputStream.java:103)
        at hudson.remoting.ChunkedCommandTransport.readBlock(ChunkedCommandTransport.java:39)
        at hudson.remoting.AbstractSynchronousByteArrayCommandTransport.read(AbstractSynchronousByteArrayCommandTransport.java:35)
        at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:63)
hudson.remoting.RequestAbortedException: java.net.SocketException: Connection timed out (Read failed)
        at hudson.remoting.Request.abort(Request.java:329)
        at hudson.remoting.Channel.terminate(Channel.java:992)
        at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:96)
        Suppressed: hudson.remoting.Channel$CallSiteStackTrace: Remote call to CLI connection to <URL>
                at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1693)
                at hudson.remoting.Request.call(Request.java:192)
                at hudson.remoting.Channel.call(Channel.java:907)
                at hudson.remoting.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:281)
                at com.sun.proxy.$Proxy3.main(Unknown Source)
                at hudson.cli.CLI.execute(CLI.java:380)
                at hudson.cli.CLI._main(CLI.java:644)
                at hudson.cli.CLI.main(CLI.java:426)
Caused by: java.net.SocketException: Connection timed out (Read failed)
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at java.io.FilterInputStream.read(FilterInputStream.java:133)
        at java.io.FilterInputStream.read(FilterInputStream.java:107)
        at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:114)
        at javax.crypto.CipherInputStream.read(CipherInputStream.java:239)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
        at hudson.remoting.FlightRecorderInputStream.read(FlightRecorderInputStream.java:91)
        at hudson.remoting.ChunkedInputStream.readHeader(ChunkedInputStream.java:72)
        at hudson.remoting.ChunkedInputStream.readUntilBreak(ChunkedInputStream.java:103)
        at hudson.remoting.ChunkedCommandTransport.readBlock(ChunkedCommandTransport.java:39)
        at hudson.remoting.AbstractSynchronousByteArrayCommandTransport.read(AbstractSynchronousByteArrayCommandTransport.java:35)
        at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:63)

出于测试目的,甚至在从属配置上也没有设置空闲时间。

jenkins 作业完成 12 分钟后抛出错误消息。即使作业需要 4 小时,它也会成功执行作业并在最后抛出错误。

如果连接断开,则错误会在问题发生时出现,而不总是在作业完成后出现。

我应该检查什么 network/firewall 来解决这个问题?我们没有为从属连接设置任何特定端口。

tcpdump 非常大,持续时间较长,可以检查它何时真正下降。 有什么更好的方法来解决问题。

听起来您的 Jenkins 主服务器和从服务器之间有什么东西正在断开您的会话。那个或者你的奴隶在你的构建过程中没有反应。我让 Jenkins 构建长达 24 小时都没有问题,对构建的长度没有任何严格的限制。

如果我不得不猜测您在主从之间有一个 VPN 隧道或 NAT 网关,并且由于构建没有向主报告任何内容,因此没有任何内容被发送。 VPN 和 NAT 网关将定期结束在给定时间间隔内不发送任何数据的连接,以清除它们的连接表。 SSH 有一个内置的 keepalive 功能来解决这个问题。

在你的 build slave 上尝试 setting the following in /etc/ssh/ssh_config(假设你使用的是 openssh):

ServerAliveInterval 300

这将告诉您的从站每 5 分钟发送一个 no_op 数据包,以确保中间网络设备不会终止您的连接。

看起来不像Jenkins supports setting keepalive on the master side yet