犯人はお前だったのか!!!! プロキシ!!!!
MattermostとJenkinsのTest Connectionに失敗する
以前、Mattermostとjenkinsの連携をVagrantを使って連携を行いました。
そのときは、Mattermost と JenkinsがそれぞれゲストOSで動作していたこともあり、連携がサクッと出来ました。
今回、MattermostとJenkinsが異なるサーバで動作している環境で、MattermostとJenkinsを連携させてみたところ。。。
「姉さん、事件です。Test ConnectionがFailure になります。」
ゲストOSでは、サクッと連携出来たのに・・・。
ここで、悩んでもしょうがないので、Jenkinsのログを見ることしました。
解析を始めてみる
Jenkins側の問題である可能性が高いので、/var/log/jenkins/jenkins.log を確認しました。
ログでは、Connection reset のエラーが発生していました。
ここで、頼みの綱のグーグル先生に伺ったところ、同じような問題が発生しているページを発見。
"Test connection" gives "Failure"
どうやら同じエラーのようなので、記事を読んでみました。
curlコマンドは通るのか?
curlがどうとかの話が出ていたので、念のため、Jenkinsがインストールされているマシンから Mattermostのインストールされたマシンに対してcrulコマンドを実行してみた。
# curl -i -X POST -H 'Content-Type: application/json' -d '{\"text\": \"Hello, this is some text\nThis is more text. :tada:\"}' <Webhookを設定した時にMattermostから提示されたURL>
Mattermostにメッセージが表示されたので、crulコマンドは成功であり問題なし。
チャンネルの名前は間違っていないか?
チャンネル名は、off-topicを使用していたので、合ってる。
原因は、TLSのバージョン差分?
記事の末尾まで来ると、イッシュー発行者がnginx ssh configとOpenJDK1.7とのTLSバージョンの差分で、OpenJDK1.8をインストールしてJenkinsをTLSv1なしで再起動したら成功したと報告していた。
「いやいや、nginxとか使ってない。そもそも OpenJDK1.8使ってますよ?」
どうやら、ここで初めて自分が違う問題をひいたことに気づきました。
もう一度問題を整理
ここで、焦ってもしょうがないので分かっていることを整理した。
- MattermostとJenkinsは異なるサーバで動作
- コマンドラインからのcurlコマンドは成功する(Jenkinsからもcurlコマンドを実行したら成功した)
- MattermostもJenkinsは、OpenJDK1.8を使用している
どうやら、curlコマンドが成功するのに、webhookだと失敗するのは怪しいことからcrulとwebhookでのtcpdumpを取ってみた。
# tcpdump -A
webhookの宛先がおかしい
tcpdumpを取得してみて気が付いた。
curlコマンドの時は、MattermostのサーバからJenkinsのサーバにリクエストを出していた。
しかし、JenkinsからwebhookでMattermostにリクエストした場合、宛先がMattermostのサーバではなく、知らないIPアドレスであることに気が付いた。
ここで、環境について追加事項がある。
Jenkinsをインストールをしたマシンは直接外部のネットワークには繋げられず、プロキシ経由でプラグインをダウンロードしている。
「いやいや、まさかプロキシじゃ・・・」
半信半疑で、Jenkinsのプラグイン管理からプロキシの設定を削除し、再度、Test Connectionを実行してみた。
Success
うまく行きました。
まとめ
まさかプロキシの影響とは考えてなかったので、Successが出た瞬間に「プロキシかよ」と一人ツッコミしてしまいました。プラグインをインストールするために、設定していたプロキシが影響しているとは思いもよりませんでした。
- サーバ間で通信できない場合は、送信元でtcpdumpを実行し、通信の中身を見てみる。
- プロキシは流石に影響しないと思い込んでいた、問題ない・影響ないとは思い込まずに対象として調べる。