Jenkins 2.7.4安装在RedHat Server中,Linux Slave通过选择"Launch agent via execution of command on master"选项进行配置。我们创建了一个Shell脚本,它在Jenkins版本2.7.4中运行良好。
现在我们将Jenkins升级到2.121.1。
<====[JENKINS REMOTING CAPACITY]===>线程"main"出现异常java. io. StreamCorruptedException:无效的流头:099EACED at java. io. ObjectInputStream. readStreamHeader(ObjectInputStream.java:808),位于java.io.ObjectInputStream。(ObjectInputStream.java:301),位于hudson.remoting.ObjectInputStreamEx。(ObjectInputStreamEx.java:48),位于hudson. remoting. MapelBuilder. makeTransport(java:478)在hudson. remoting. remotelBuilder. negotiate(java:433)在www.example.com(java:354)在hudson. remoting. Launcher. main(Launcher.java:743)位于hudson. remoting. Launcher. runWithStdinStdout(Launcher.java:691),网址:www.example.com(Launcher.java:373)at hudson. remoting. Launcher. main(Launcher.java:283)错误:连接终止错误:hudson.remoting.ChannelBuilder.buildhudson. remoting. ChunkedInputStream. readUntilBreak(ChunkedInputStream.java:99)上的意外错误hudson. remoting. ChunkedCommandTransport. readBlock(ChunkedCommandTransport.java:39)上的错误www.example.com(AbstractSynchronousByteArrayCommandTransport.java:35)上的错误hudson. remoting. SynchronousCommandTransport $ReaderThread.run(SynchronousCommandTransport.java:63)另外:hudson. remoting. Channel $CallSiteStackTrace:hudson.remoting.Launcher.run46)at jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)at www.example.com(Unknown Source)at java. util. concurrent. ThreadPoolExecutor. runWorker(Unknown Source)at java. util. concurrent. ThreadPoolExecutor $www.example.com(Unknown Source)at www.example.com(Unknown Source)导致:hudson. remoting. RequestAbortedException at hudson. remoting. Request. abort(Request.java:340)at hudson. remoting. Channel. terminate(Requestel.java:1038)at hudson. remoting. SynchronousCommandTransport $ReaderThread.run(SynchronousCommandTransport.java:96)
如果我在Manage Jenkins-> Configure Security中禁用SSHD端口,那么我就可以启动我的slave。但是在我的脚本中,我将使用Jenkins-cli.jar触发一个作业,将二进制文件从master复制到slaves。java -jar jenkins-cli.jar -s http://localhost:8080 --ssh -user username -i ~/.ssh/id_rsa build RTT/RTT-CI-Tools/RTT-CI-Tools-Distribute -s -p SLAVE_REGEX=slave name
我收到一条消息,
"WARNING: No header 'X-SSH-Endpoint' returned by Jenkins"
字符串
我也试过在jenkins-cli.jar命令中将-ssh替换为-http,java -jar jenkins-cli.jar -s http://localhost:8080 -http -auth username:60b3450a883a2519592af84cdcd0d224 build $CI_JOB -s -p SLAVE_REGEX=$SLAVEHOST
个
它会触发任务。同样无法启动从机,
<=[JENKINS REMOTING CAPACITY]=>线程"main"出现异常java. io. StreamCorruptedException:无效的流头:099FACED at java. io. ObjectInputStream. readStreamHeader(ObjectInputStream.java:808),位于java.io.ObjectInputStream。(ObjectInputStream.java:301),位于hudson.remoting.ObjectInputStreamEx。(ObjectInputStreamEx.java:48),位于hudson. remoting. MapelBuilder. makeTransport(java:478)在hudson. remoting. remotelBuilder. negotiate(java:433)在www.example.com(java:354)在hudson. remoting. Launcher. main(Launcher.java:743)位于hudson. remoting. Launcher. runWithStdinStdout(Launcher.java:691),网址:www.example.com(Launcher.java:373)在hudson. remoting. Launcher. main(Launcher.java:283)用法:hudson.remoting.ChannelBuilder.build
如何解决这个问题
1条答案
按热度按时间zaq34kh61#
stdin不变,stdout不变
我相信你的脚本中有东西在篡改标准输入。
您的脚本应该将完整的、未更改的stdin流传递给Jenkins代理进程。
通用解决方案
OP建立Jenkins会话的命令与我的命令不同,但无论如何,您应该将启动脚本分为3个主要部分:
**设置:**在这一部分不篡改stdin或stdout。
建立Jenkins会话:
java -jar jenkins-cli.jar ...
**Tear down:**在这一部分不篡改stdin或stdout。
字符串
但为什么?
启动脚本的任务是在主服务器和构建代理之间建立一个未被篡改的通信通道(通过stdin和stdout)。
型
如果这个通讯频道被篡改了Jenkins就不能用了
型
如果你不把任何东西通过管道传输到某些Unix命令中,它可能会“吞下”你的启动脚本的stdin,从而“破坏”通信通道。
型
yes
被导出并进行十六进制转储,因为keep_stdin_intact
没有篡改stdin,在本例中是“yes”流。yes
已经消失了,因为swallow_stdin
消耗了它,所以cat
没有什么可cat的,xdd
没有什么可读的。/dev/null
通过管道传输到stdin-swallowing命令,我们保护了自己的stdin。ssh怎么了?
ssh
是吞噬你的标准输入的邪恶命令之一。假设您想在运行
agent.jar
之前删除构建代理上的一些文件。如果没有样板文件,您可能会这样写:型
^但这是错误的!第一个
ssh
命令会吞下你的stdin,Jenkins会话将没有任何内容可读。第一个
ssh
必须“静默”。将/dev/null
作为其标准输入。型