こんにちは、テクマトリックスの長久保です。
今回は「Jenkinsのエージェントが勝手に切断される」という問題に対応する機会があったので、問題と対策を紹介します。
同様の問題が起きている方の参考になれば幸いです。

前提

OSはJenkinsもエージェントもWindowsです。
エージェントとの接続方法については以下の様に接続しています。
起動方法:Launch agent by connecting it to the controller
Use WebSocket:有効

対処方法1:問題のあるJenkinsを利用していないか確認する

  • 問題:Jenkinsのバージョンが2.361.xである。
  • 対策1:2.387.2 LTS以上のバージョンにJenkinsをバージョンアップする。
  • 対策2:Jenkinsの実行引数に-Djenkins.websocket.pingInterval=15を追加する。

バージョン2.361.xのJenkinsでWebSocketで接続したエージェントが断続的に切断される問題が報告されています。詳細は次のリンクを参照ください。
Websocket Inbound Agents disconnect intermittently due to “WebSocketTimeoutException: Connection Idle Timeout”

対策としては、本問題が修正済みの2.387.2 LTS以上のバージョンにJenkinsをバージョンアップしてください。
バージョンアップが難しい場合、システムプロパティ「-Djenkins.websocket.pingInterval=15」をJenkinsの実行時引数に追加し、ping間隔を15秒以下に設定することで回避できます。
実行時引数への追加方法がわからない場合、How to add Java arguments to Jenkins?こちらのページを参照ください。

対処方法2:コントローラー・エージェント間でJava、agent.jarを揃える

  • 問題:JenkinsのコントローラーとエージェントのJavaのバージョンが異なる。
  • 対策:Javaのバージョンを揃える。
  • 問題:Jenkinsのバージョンとagent.jarのバージョンが異なる。
  • 対策:{JenkinsURL}/jnlpJars/agent.jarからagent.jarを取得し、エージェントマシンに再配置する。

JenkinsのコントローラーとエージェントのJavaのバージョンやagent.jarのバージョンは統一しましょう。例えばJenkinsを更新したのに、エージェントのagent.jarは更新しないというパターンが見受けられます。
Jenkinsが参照しているJavaのバージョンはJenkinsのダッシュボード > Jenkinsの管理 > システム情報 > java.versionで確認できます。
agent.jarは{JenkinsURL}/jnlpJars/agent.jarで取得可能です。取得したagent.jarを、各エージェントの「リモートFSルート」に配置してあるagent.jarと差し替えてください。

対処方法3:問題があるJDKを使用していないか確認する

  • 問題:JDKのバージョンが11.0.2である。
  • 対策:JDKのバージョンを11.0.8以上にする。

「エージェントマシンのCPU使用率が高い」といった場合はJDKが問題になっている可能性があります。
stack overflow:java 11 HttpClient leads to endless SSL loop
こちらが原因でCPUの使用率が100%になっている場合、エージェントの接続にも影響があると考えられます。

openjdk:half-closed SSLEngine status may cause application dead loopによると、問題があるJDKのバージョンは以下であり、11.0.8にて修正されているとのことですので、JDKの更新をお試しください。

openjdk version “11.0.2” 2019-01-15
OpenJDK Runtime Environment (build 11.0.2+9-Debian-3)
OpenJDK 64-Bit Server VM (build 11.0.2+9-Debian-3, mixed mode, sharing)

openjdk:half-closed SSLEngine status may cause application dead loop

対処方法4:ファイアーウォールやセキュリティソフト等を確認する

  • 問題:セキュリティソフト等で切断されている。
  • 対策:セキュリティソフト等の設定を見直す。

エージェントのコンソールに「確立された接続がホストコンピューターのソフトウェアによって中止されました」と表示されている場合は、Jenkinsが動作しているマシンのファイアーウォールやセキュリティソフト等で切断されている可能性があります。

対処方法5:Node Monitoringを確認する

  • 問題:エージェントマシンのディスクの空き容量が少ない。
  • 対策1:エージェントマシンのディスクの空き容量を増やす。
  • 対策2:一時的にNode Monitoringの設定を無効化する。

エージェントにはディスクの空き容量の閾値を設定し、閾値を下回った場合エージェントをオフラインにするという仕組みがあります。Jenkinsのダッシュボード > Jenkinsの管理 > Nodes and Clouds > Node Monitoring > 空きディスク容量 > 「空き容量の閾値」で設定可能です。

ドライブの空き容量が「空き容量の閾値」以下になっている、またはジョブ実行時にSCMからチェックアウト時に「空き容量の閾値」以下になるといった場合、対応が必要です。
また、一時的にこちらのオプションをオフにするため、
・空きスワップ容量
・空きテンポラリ容量
・空きディスク容量
のチェックを外して「保存」を押してエージェントの切断が回避できるかお試しください。

まとめ

ここに挙げた問題以外にも、様々な要因でJenkinsとエージェント間の接続が切断される可能性があります。
弊社テクマトリックスではTechMatrix Enterprise Support for JenkinsというJenkinsに関するテクニカルサポートも実施しておりますので、Jenkinsに関連するトラブルがありましたらご相談ください。


宣伝

興味は沸いたがノウハウが無いのでとっかかりが欲しい

CI/CD環境構築
「スモールスタートしたい」「ちょっと興味はあるんだけどうちの開発は少し特殊でネット上の情報も有益なものが無い」「やりたいことはなんとなくイメージはつくんだけど実現・実装方法について相談したい」など、環境構築についてお困りなことがある方は是非お問合せいただければと思います。

Jenkinsについて詳しく学習したい

このブログ内にでてきた並列でのパイプラインの組み方や、共有ライブラリについて知りたいという方、そもそも現在もフリースタイルジョブでJenkinsを利用しておりパイプラインを使ったことが無いという方は、Jenkinsのトレーニングをお勧めします
Jenkinsトレーニング
バックアップやユーザー管理、セキュリティ等、Jenkinsの管理者向けの「Jenkins 管理-基礎」、パイプライン初心者向けの「パイプライン基礎」、共有ライブラリといったパイプラインの発展的な内容を扱う「パイプライン中級」とレベル別に体系的に学習することができます。
各開発環境ごとに適したパイプラインは異なると思いますので、ぜひ体系的に知識を身に着けて、開発環境の改善に役立ててください。

By nagakubo

主にCI環境構築をメインで担当しています。 Certified CloudBees Jenkins Engineer (CCJE)