2016-10-05 6 views
1

masterからjenkins cliコマンドを実行しようとしています。スレッド "main"の例外java.io.StreamCorruptedException:無効なストリームヘッダー:0BDAACED

SSH [email protected]の-C "は/ usr/binに/ javaの-jar /home/user/slave.jar"

に次のエラー行き方:

<===[JENKINS REMOTING CAPACITY]===>Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 0BDAACED 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:808) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:301) 
    at hudson.remoting.ObjectInputStreamEx.<init>(ObjectInputStreamEx.java:48) 
    at hudson.remoting.ChannelBuilder.makeTransport(ChannelBuilder.java:430) 
    at hudson.remoting.ChannelBuilder.negotiate(ChannelBuilder.java:389) 
    at hudson.remoting.ChannelBuilder.build(ChannelBuilder.java:310) 
    at hudson.remoting.Launcher.main(Launcher.java:528) 
    at hudson.remoting.Launcher.runWithStdinStdout(Launcher.java:468) 
    at hudson.remoting.Launcher.run(Launcher.java:242) 
    at hudson.remoting.Launcher.main(Launcher.java:195) 
ERROR: Unexpected error in launching an agent. This is probably a bug in Jenkins 
hudson.remoting.RequestAbortedException: java.io.IOException: Unexpected EOF 
    at hudson.remoting.Request.abort(Request.java:303) 
    at hudson.remoting.Channel.terminate(Channel.java:847) 
    at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:92) 
    at ......remote call to ubuntu-slave(Native Method) 
    at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1416) 
    at hudson.remoting.Request.call(Request.java:172) 
    at hudson.remoting.Channel.call(Channel.java:780) 
    at hudson.slaves.SlaveComputer.setChannel(SlaveComputer.java:508) 
    at hudson.slaves.SlaveComputer.setChannel(SlaveComputer.java:381) 
    at hudson.slaves.CommandLauncher.launch(CommandLauncher.java:131) 
    at hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:253) 
    at jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    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) 
Caused by: java.io.IOException: Unexpected EOF 
    at hudson.remoting.ChunkedInputStream.readUntilBreak(ChunkedInputStream.java:99) 
    at hudson.remoting.ChunkedCommandTransport.readBlock(ChunkedCommandTransport.java:39) 
    at hudson.remoting.AbstractSynchronousByteArrayCommandTransport.read(AbstractSynchronousByteArrayCommandTransport.java:34) 
    at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:59) 
ERROR: Connection terminated 
java.io.IOException: Unexpected EOF 
    at hudson.remoting.ChunkedInputStream.readUntilBreak(ChunkedInputStream.java:99) 
    at hudson.remoting.ChunkedCommandTransport.readBlock(ChunkedCommandTransport.java:39) 
    at hudson.remoting.AbstractSynchronousByteArrayCommandTransport.read(AbstractSynchronousByteArrayCommandTransport.java:34) 
    at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:59) 
ERROR: Process terminated with exit code 1 

を教えてください何が問題なの?

+0

接続先はオブジェクトストリームではないため、これは設定上の問題です。 –

+0

ビルドノードの1つに同じ問題があります。 "0BDAACED"のためのグーグルでは、同じ問題のいくつかの説明が見つかりました。私には解決策がありません。私が今までに見つけたもの:例外をスローするreadStreamHeaderメソッドは、スレーブのstdinからbigendianの2つの16ビット値を読み込み、0xACED(STREAM_MAGIC)の後に0x0005(STREAM_VERSION)を見つけることを期待しますが、0x0BDA(??) 0xACEDによって。 STREAM_MAGICは実際には存在しますが、予想よりも2バイト遅れていることに注意してください。その後も、正しいSTREAM_VERSIONが続きます。何かが同期していない2バイトです。 –

答えて

0

短い答え

ジェンキンスslave.jarは、スレーブの標準入力/標準出力を通じてジェンキンスサーバーと通信します。 stdin/stdoutをスレーブに/からスレーブに転送するには、sshを使用します。

スレーブに到達する前にstdinでタンパーを認識していないことがあり、結果として生じる通信プロトコル違反により、表示される例外が発生します。

長い説明や修正

私はあなたがジェンキンスサーバー上でシェルスクリプトでは、スレーブを起動し、あなたの質問からsshコマンドがあるとし、このシェルスクリプトは、他のを持っていることこのコマンドの前にあるコマンドを入力します。これは私の場合では、スレーブに正しいslave.jarをコピーするようなことができることを示唆するジェンキンのリモーティング文書に触発されているからです。

私たちはどちらも、「サーバーでコマンドを実行してエージェントを起動」オプションを使用してスレーブエージェントを起動しています。私の場合は、スレーブに到達するためにsshジャンプホストを使用できるようにするためにこれを行いますが、これはこの回答とは関係ありません。

ここでは、リモートノード上でslave.jarを起動するための動作していないシェルスクリプトの例を示します。次に、観察された動作の原因を推測します。私はシェルとして/ bin/bashを使用して、他のものを自由に使用してください。

1)これらのバージョンがすでにスレーブ

#!/bin/bash                  
ssh [email protected] "java -jar /home/user/slave.jar" 

にslave.jarを持っている場合は、両方の仕事。

#!/bin/bash                  
exec ssh [email protected] "java -jar /home/user/slave.jar" 

両方のバージョンには、1つのコマンドしかありません。 stdinまたはstdoutでタンパーするものは他にありません。最初のバージョンでは、シェルはsdコマンドの前後にstdin/stdoutを置き換えて転送します。 2番目のバージョンでは、シェルはsshプロセスに置き換えられ、stdin/stdoutを直接継承します。両方のバージョンは正常に動作し、最初のバージョンの追加のシェルプロセスはどのシステムでも問題にならないはずです。

2)のスレーブもちろん

#!/bin/bash 
scp -q /some/location/slave.jar [email protected]:. 
exec ssh [email protected] "java -jar /home/user/slave.jar" 

上でそれを実行する前に、スレーブにサーバー上のいくつかの場所からこのバージョンをコピーしslave.jar、あなたが/いくつか/場所/スレーブを持っている場合は、この唯一の作品。 jarファイルをサーバー上に作成します。

3)このバージョンでは、スレーブエージェントを起動する前に、スレーブに対して追加のクリーンアップを試行します。

#!/bin/bash 
ssh [email protected] "rm -rf /home/user/tmp/jenkins" 
exec ssh [email protected] "java -jar /home/user/slave.jar" 

スレーブ上の/ home/user/tmp/jenkinsの場所は単なる例です。 このバージョンは、4分のタイムアウト後に失敗します。質問からの正確なエラーメッセージ。

4)例3作品

#!/bin/bash 
ssh [email protected] "rm -rf /home/user/tmp/jenkins" </dev/null 
exec ssh [email protected] "java -jar /home/user/slave.jar" 

を作るためのさまざまな方法を:あなたは、次の例に見るように失敗は、ホーム/ユーザーを/ tmp /ジェンキンス/から行方不明に重要なものが原因ではありません。最初の修正で

#!/bin/bash 
exec ssh [email protected] "rm -rf /home/user/tmp/jenkins && java -jar /home/user/slave.jar" 

、我々はスレーブと通信するために、標準入力をリモートrmコマンドに転送されていないことを確認してください。 rmはstdinを読みませんが、明らかにsshはそれを知りませんし、それ自身のstdinからいくつかのバイトをバッファし、必要に応じてリモートコマンドに転送します。これは、スレーブ通信を目的としたstdinではなく、rmコマンドに/ dev/nullをstdinとして転送することで解決されます。

2番目の修正では、sshコマンドは1つだけ使用され、rmコマンドはstdinから何も読み取らず、slave.jarは改ざんされていないストリームを受け取ります。

関連する問題