RailsでElasticSearchとRansack+CircleCIでの設定でちょっとハマったのでメモ


今後似たようなことをまたやるかもしれないので、自分用のメモとしてまとめておきます。

環境

ElasticSearchはバージョンによって変更点が色々ありそうなので関連しそうな情報を以下記載しておきます

  • Mac OS X El Capitan(10.11.4)
  • Ruby 2.2.2
    • rbenvを利用してインストールしてます
    • ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin15]
  • Java 1.8.0_74
  • ElasticSearch 2.3

何にハマったのか症状と回避方法を先にまとめる

Gemfileに

gem 'elasticsearch-model'
gem 'elasticsearch-rails'

を追加した上で、任意のModelからElasticSearchの機能を利用できる機能を実装してました

トラブルの内容

開発環境では意図した動作が出来ていたので、そのコードをGitHubにpushしてCircleCIでテストが実行された時に

     Faraday::ConnectionFailed:
       Connection refused - connect(2) for "localhost" port 9200

というエラーが出るようになった

回避方法

以下順番で解決を試み解決しました!

  • RansackのsearchとElasticSearchのsearchがコンフリクトするのが要因かと思い対応をする
    • 解決せず
  • 開発環境で問題ない。CircleCIの環境だけテストに失敗していたのでcircle.ymlにElasticSearchを利用する設定を追加して解決しました!
    • ちなみにローカルの環境でもElasticSearchが起動してない状態だと実はテストに失敗することをその後に知った

試みた解決策について補足

以下は自分の作業記録的なものですが一応まとめておきます。

RansackのsearchとElasticSearchのsearchがコンフリクトするのでその対応

これはRansackのGitHubのRansack #search methodに記載あるのですがRansackのsearchメソッドが他のgemなどとバッティングするようだったら

  • by patching the extended class_method in Ransack::Adapters::ActiveRecord::Base to remove the line alias :search :ransack unless base.respond_to? :search
  • by placing the following line in your Ransack initializer file at config/initializers/ransack.rb

という記述があり、ひとまず自分は後者のやり方を選択しました。

補足

ちなみに元々のコードは、config/initializers/ransack.rbを作成する前から、

Article.ransack(params[:q])

としていたので、そもそも違う要因だったはずなんだけど、その事にきづけなかった・・・

ローカルの環境でもElasticSearchが起動してない状態でうまく動作しない

それまで開発をしていた環境とは別のマシンで同様の環境を作ろうと思って

./bin/rake db:migrate

した時に何故かエラーになった。

メッセージ見たらConnection refused - connect(2) for "localhost" port 9200という表示があり、9200番ポートってElasticSearchなんで、

  • ElasticSearchのインストール&起動
  • 再度db:migrate

で、無事にmigationが出来ました。

この時にローカルの環境でもElasticSearchが起動してない状態で実はテストに失敗するんじゃないのかと思って、

  • 一度ElasticSearchを終了させる
  • RSpecを実行

という作業をしたら、

# Errno::ECONNREFUSED:
#   Connection refused - connect(2) for "localhost" port 9200

という表示があり自分の予想通りの結果が生じ、ElasticSearchを起動した上でRSpecを実行したら、無事にテストはパスしました!

余談

別のマシンで同様の環境を作ろうと思ったのは、仕事の打ち合わせでデモをするためだったのですが、その環境構築を出かける前にとりかかった時に発覚し、そもそもローカルの環境自体が起動しないという最悪の状況だったのでだいぶ焦った^^;