Jenkinsでmaster-slave間の通信が不安定なときはslave.jarの起動オプションを疑え

現在、awsのspot instanceを利用してRailsプロジェクトのテストを並列実行しようと試行錯誤しています。

なぜだかmaster-slave間の通信が不安定で困っていたのですが、ようやく打開策を見つけました。

  • 症状

    • slave側のテストの状況がモニタリングできなくなる
    • slaveの処理が止まっているわけではないみたい
    • nodeの接続がすぐに切れるわけではないが、しばらくすると切れてしまう
  • ログの状況

    • 不安定なときのnodeのログは次のようになっていました。
[04/24/14 20:29:44] [SSH] ip-172-16-2-101.ec2.internal:22とのSSHコネクションをオープン
[04/24/14 20:29:44] [SSH] 認証成功
[04/24/14 20:29:45] [SSH] リモートユーザーの環境:
AWS_AUTO_SCALING_HOME=/opt/aws/apitools/as
AWS_CLOUDWATCH_HOME=/opt/aws/apitools/mon
AWS_ELB_HOME=/opt/aws/apitools/elb
AWS_IAM_HOME=/opt/aws/apitools/iam

(略)

[04/24/14 20:29:45] [SSH] javaのJavaバージョンをチェック
[04/24/14 20:29:45] [SSH] java -version returned 1.7.0_55.
[04/24/14 20:29:45] [SSH] sftpクライアントの開始
[04/24/14 20:29:45] [SSH] 最新のslave.jarをコピー中...
[04/24/14 20:29:45] [SSH] 404,201 バイトコピー.
Expanded the channel window size to 4MB
[04/24/14 20:29:45] [SSH] スレーブのプロセスを開始: cd "/media/ephemeral0/jenkins" && java  -jar slave.jar
<===[JENKINS REMOTING CAPACITY]===>channel started
Slave.jar version: 2.39
これはUnixのスレーブです。
Effective SlaveRestarter on ip-172-16-2-101.ec2.internal: null
Slave successfully connected and online


Apr 24, 2014 9:28:47 PM hudson.slaves.ChannelPinger$1 onDead
INFO: Ping failed. Terminating the channel.
java.util.concurrent.TimeoutException: Ping started on 1398342287626 hasn't completed at 1398342527626
        at hudson.remoting.PingThread.ping(PingThread.java:120)
        at hudson.remoting.PingThread.run(PingThread.java:81)

Ping failed.だそうです。

  • 解決方法
    • slave.jarの起動オプションに-textをつける。具体的には[Jenkinsの管理] - [ノードの管理] - (ノードを選択) - [設定] でSuffix Start Slave Command-textをつける。頭にスペースを入れること!

f:id:tech-kazuhisa:20140426193629j:plain

  • Distributed builds - 日本語 - Jenkins Wiki によると

    スレーブ起動のために、telnetのような (バイナリデータを直接扱えない) binary-unsafe なリモート操作用のメカニズムを使っているなら、 slave.jar の実行時に -text オプションを追加して下さい。

とあります。うーん。Macでmaster-slave構成を組んでいた時は何も問題が無かったんだけどな。ともあれ、slaveとの通信が不安定なときはtextモードを試してみましょう。