Jenkins Windows 从站连接终止 java.nio.channels.ClosedChannelException

Jenkins Windows slave connection getting terminated with java.nio.channels.ClosedChannelException

作为从机连接到 windows 机器时,出现以下错误,我认为这是一些与网络相关的问题,但需要一些帮助,从哪里开始寻找或可能的解决方案是什么。

INFO: Terminated
Aug 01, 2017 10:15:54 PM hudson.remoting.JarCacheSupport run
WARNING: Failed to resolve a jar 06bcb4519543f5ec83cf9d6da9f6cfbe
java.io.IOException: Failed to write to C:\Users\Administrator\.jenkins\cache\jars\BCB4519543F5EC83CF9D6DA9F6CFBE.jar
        at hudson.remoting.FileSystemJarCache.retrieve(FileSystemJarCache.java:133)
        at hudson.remoting.JarCacheSupport.run(JarCacheSupport.java:64)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:483)
        at java.util.concurrent.FutureTask.run(FutureTask.java:274)
        at hudson.remoting.AtmostOneThreadExecutor$Worker.run(AtmostOneThreadExecutor.java:110)
        at java.lang.Thread.run(Thread.java:809)
Caused by: java.io.IOException: Backing channel 'JNLP4-connect connection to dr2r4m1p21/172.20.238.41:9001' is disconnected.
        at hudson.remoting.RemoteInvocationHandler.channelOrFail(RemoteInvocationHandler.java:192)
        at hudson.remoting.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:257)
        at com.sun.proxy.$Proxy4.writeJarTo(Unknown Source)
        at hudson.remoting.FileSystemJarCache.retrieve(FileSystemJarCache.java:98)
        ... 5 more
Caused by: java.nio.channels.ClosedChannelException
        at org.jenkinsci.remoting.protocol.impl.ChannelApplicationLayer.onReadClosed(ChannelApplicationLayer.java:208)
        at org.jenkinsci.remoting.protocol.ApplicationLayer.onRecvClosed(ApplicationLayer.java:222)
        at org.jenkinsci.remoting.protocol.ProtocolStack$Ptr.onRecvClosed(ProtocolStack.java:832)
        at org.jenkinsci.remoting.protocol.FilterLayer.onRecvClosed(FilterLayer.java:287)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.onRecvClosed(SSLEngineFilterLayer.java:181)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.switchToNoSecure(SSLEngineFilterLayer.java:283)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.processWrite(SSLEngineFilterLayer.java:503)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.processQueuedWrites(SSLEngineFilterLayer.java:248)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.doSend(SSLEngineFilterLayer.java:200)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.onRecvClosed(SSLEngineFilterLayer.java:166)
        at org.jenkinsci.remoting.protocol.ProtocolStack$Ptr.onRecvClosed(ProtocolStack.java:832)
        at org.jenkinsci.remoting.protocol.NetworkLayer.onRecvClosed(NetworkLayer.java:154)
        at org.jenkinsci.remoting.protocol.impl.BIONetworkLayer.access00(BIONetworkLayer.java:48)
        at org.jenkinsci.remoting.protocol.impl.BIONetworkLayer$Reader.run(BIONetworkLayer.java:247)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1157)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:627)
        at hudson.remoting.Engine.run(Engine.java:94)
        ... 1 more

上面提到的堆栈跟踪来自 salve (Windows) 机器,而我的 Jenkins/Master 在 RHEL 上是 运行,我可以在那里看到以下堆栈跟踪。

INFO: Accepted JNLP4-connect connection #113 from /172.20.238.31:60363
Aug 01, 2017 12:45:55 PM jenkins.slaves.DefaultJnlpSlaveReceiver channelClosed
WARNING: Computer.threadPoolForRemoting [#42] for Build_Agent terminated
java.nio.channels.ClosedChannelException
        at org.jenkinsci.remoting.protocol.impl.ChannelApplicationLayer.onReadClosed(ChannelApplicationLayer.java:208)
        at org.jenkinsci.remoting.protocol.ApplicationLayer.onRecvClosed(ApplicationLayer.java:222)
        at org.jenkinsci.remoting.protocol.ProtocolStack$Ptr.onRecvClosed(ProtocolStack.java:832)
        at org.jenkinsci.remoting.protocol.FilterLayer.onRecvClosed(FilterLayer.java:287)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.onRecvClosed(SSLEngineFilterLayer.java:181)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.switchToNoSecure(SSLEngineFilterLayer.java:283)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.processWrite(SSLEngineFilterLayer.java:503)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.processQueuedWrites(SSLEngineFilterLayer.java:248)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.doSend(SSLEngineFilterLayer.java:200)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.doCloseSend(SSLEngineFilterLayer.java:213)
        at org.jenkinsci.remoting.protocol.ProtocolStack$Ptr.doCloseSend(ProtocolStack.java:800)
        at org.jenkinsci.remoting.protocol.ApplicationLayer.doCloseWrite(ApplicationLayer.java:173)
        at org.jenkinsci.remoting.protocol.impl.ChannelApplicationLayer$ByteBufferCommandTransport.closeWrite(ChannelApplicationLayer.java:311)
        at hudson.remoting.Channel.close(Channel.java:1295)
        at hudson.remoting.Channel.close(Channel.java:1263)
        at jenkins.slaves.DefaultJnlpSlaveReceiver.afterChannel(DefaultJnlpSlaveReceiver.java:173)
        at org.jenkinsci.remoting.engine.JnlpConnectionState.invoke(JnlpConnectionState.java:421)
        at org.jenkinsci.remoting.engine.JnlpConnectionState.fire(JnlpConnectionState.java:312)
        at org.jenkinsci.remoting.engine.JnlpConnectionState.fireAfterChannel(JnlpConnectionState.java:418)
        at org.jenkinsci.remoting.engine.JnlpProtocol4Handler$Handler.run(JnlpProtocol4Handler.java:334)
        at jenkins.util.ContextResettingExecutorService.run(ContextResettingExecutorService.java:28)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
  • 更新我们的 jenkins master 后,我观察到同样的错误。这可能是由于 Java 7 (v80) 和最新的 Java 8.
  • 不兼容所致
  • 检查你的主人使用的 java 版本,以及你的奴隶的 java 版本。
  • 在我的例子中,我是 运行 swarm-client-2.0-jar-with-dependencies.jar 在 linux 主机上,它使用 Java 7.

    java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

  • 我们的 jenkins master 升级了,现在 运行 Java 8

    java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

  • 当从站上的 java 更新为 Java 8 时,连接问题消失了。

我遇到了同样的问题。我发现如果您的作业不是针对 GUI 的 运行,windows slave 会切换到 "sleep" 模式。

  • 对于windows...没有鼠标或键盘的移动意味着没有activity。

那么就顺利解决了。在 Windows7 奴隶上,这是我所做的:

  • 控制Panel\Hardware和Sound\Power选项
  • 显示其他计划
  • select高性能

  • 控制Panel\Hardware和Sound\PowerOptions\Edit计划设置

  • 从不关闭显示
  • 更改高级电源设置 --> 10000 分钟后关闭硬盘

经过这个程序应该没问题

我遇到了与 OP 类似的错误,其中与我的奴隶的连接断开了。问题的根本原因不是由于 Jenkins 从主机和主主机之间的 Java 版本不匹配。

解决方案 如果您在弹性负载均衡器 (ELB) 后面的 AWS 上的 EC2 实例中使用 运行 Jenkins,请将 "attributes" 部分下的 "idle timeout" 值从默认的 60 秒增加。我将新值设置为 600,并且不再遇到错误。

看来,如果构建过程中的单个命令花费超过 60 秒且没有日志输出,ELB 将因空闲而终止会话 activity。

来源:https://issues.jenkins-ci.org/browse/JENKINS-44001?focusedCommentId=312412&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-312412

除了post中的错误日志外,我还在slave的jenkins目录下得到了错误日志(对我来说是C:\jenkins\jenkins-slave.err.log):

JNLP file http://jenkins.domain.com/computer/my_slave_name/slave-agent.jnlp?encrypt=true has invalid arguments: [#####################################, my_slave_name, -workDir, c:\jenkins, -internalDir, remoting, -url, http://jenkins.domain.com/, -headless, -jar-cache, C:\Users\Administrator.jenkins\cache\jars] Most likely a configuration error in the master "-workDir" is not a valid option

我的解决方案:

1)windows slave level: close GUI 中的 services console for all用户——这是必须的。出于某种原因,Microsoft 正在锁定 installation/removal 的 windows 服务

2)windows slave 级别:杀死所有 javajenkins-slave 进程(如果存在)

3)windows slave level: delete 来自 cmd 的 jenkins slave service (if exist): sc delete jenkinsslave-c__jenkins /force(以我为例)

4)windows 从属级别:验证您是否安装了 java 8:我正在使用 jdk1.8.0_151卸载全部java版本

5)jenkins master ui级别:改变Jenkins在slave configure下连接到slave的方式--> Launch method: Let Jenkins control this Windows slave as a Windows service (instead of Launch agent via Java Web Start)

6) aws 级别:增加 aws elb 空闲超时600(从 60) - 就像@njtman 建议的那样

7)jenkins master ui级别:重新启动jenkins中的agent并等待几分钟。

我的环境:

詹金斯:2.89.2,os:windows 2012 R2,java:jdk1.8.0_151

虚拟奴隶来不及喘息...

好的,这是我如何解决我的特殊情况:

我有一些 VM 以 libvirt/quemu 运行 作为奴隶。因为 libvirt-plugin 对我来说不可靠,所以我自己启动了这些 VM。我问自己:“为什么这个 libvirt-plugin 有一个强制延迟时间......不耐烦......

因此,如果 libvirt-client(从属)向 jenkins 说 hello,您可能应该等待几秒钟,让这个可怜的家伙喘口气。启动后。

从机是win7主机是ubuntu18.04

我遇到了同样的问题,已使用以下步骤纠正

  1. 转到 Jenkins Url -> Manage Jenkins -> Node -> Your Node ..你会得到 Custom WorkDir path 让我们说 C:/Jenkins
  2. 打开 WorkDir 路径并删除完整的远程目录
  3. 重新启动从服务器

在 Windows 上,我意识到我需要将“-noCertificateCheck”属性添加到工作目录中 jenkins-slave.xml 的参数中。我们在主机上使用来自内部 PKI 的证书,这是解决它的最简单方法(将所有内容都放在内部网络中)。

<arguments>-Xrs  -jar "%BASE%\slave.jar" -jnlpUrl https://jenkins.ourdomain.com/computer/Windows%20build%20server%20-%20Bare%20metal/slave-agent.jnlp -secret abc -noCertificateCheck</arguments>

我通过命令提示符中的代理 运行 手动识别了这一点:

java -jar agent.jar -jnlpUrl https://jenkins.ourdomain.com/computer/Windows%20build%20server%20-%20Bare%20metal/slave-agent.jnlp -secret abc -workDir "D:\agentroot" -noCertificateCheck

好吧...对我来说,它适用于以下解决方案:

标记节点"temporary offline"并再次放回"online"

重新连接

的建议启发了我找到解决此问题的方法。

问题

我解释一下我的情况,它可能对某些人有用:

  1. 我很久以前就在我的从机上安装了 Jenkins 作为服务。
  2. 我在 Jenkins 的主机上 更新了 Java。

因此存储在 slave 上的 Jenkins 服务代码已经过时

解决方案

在每台从机上执行以下步骤:

  1. 更新Java版本。

    确保 Java 版本与主计算机上安装的版本相同或兼容。

  2. 删除旧的从机代码。它位于节点配置下远程根目录字段中指定的文件夹内。

    我删除了每个 jenkins-slave.* 文件,只留下 jenkins_agent.pid 文件和文件夹 "remoting" 和 "workspace".

  3. 从浏览器进入Jenkins的从节点界面,点击按钮。

    您将下载一个新的 JNLP 文件以在从机上安装一个新的(更新的)Jenkins 服务。

  4. 运行 下载的文件,转到菜单并单击 "Install as a service"。

希望对您有所帮助!

我的情况很简单,首先我的主节点服务器重新启动。虽然其他 devops 人员可能会在 master.So 中重新启动 jenkins 代理服务,但我不得不在从节点中重新启动 jenkins 从服务。它刚刚奏效。

我遇到了同样的问题,但是,原因与从属配置无关,因为我没有配置任何从属。我是 运行 Jenkins Tomcat (9.x),JDK 17,Windows Server 2018。我在 [=19] 中有 jenkins.war 文件=] 和展开的 WAR (webapps)。删除webapps中的'jenkins'文件夹(展开WAR)并盯着tomcat解决了问题。

这是为了记录发生的事情,可能有人会觉得有用。