CircleCI上でelasticsearch-extensionsを使ってテストを動かす

井原(@ihara2525)です。

elasticsearch-extensionsのTest::Clusterを使ってESのテストを書いているときに、ローカルの環境のまま動かそうとすると、

Starting 1 Elasticsearch nodes..sh: 1: elasticsearch: not found

とelasticsearchコマンドが見つからないと怒られてしまう場合、TEST_CLUSTER_COMMANDでコマンドの場所を指定してあげましょう。

circle.ymlの関連する部分は以下のようになりました。(YOUR_RAILS_ROOT部分はそれぞれの環境に合わせて変えてください)

dependencies:
  bundler:
    without: [production]
  cache_directories:
    - elasticsearch-1.3.2
  post:
    - if [[ ! -e elasticsearch-1.3.2 ]]; then wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.3.2.tar.gz && tar -xvf elasticsearch-1.3.2.tar.gz && elasticsearch-1.3.2/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/2.3.0; fi

test:
  override:
    - TEST_CLUSTER_COMMAND=/home/ubuntu/#{YOUR_RAILS_ROOT}/elasticsearch-1.3.2/bin/elasticsearch bundle exec rake

起動時にCircle CIにElasticsearchを動かしてもらうこともできますが、自前で1.3.2とプラグインを持ってきてキャッシュする設定だけやっておきます。 あとは以下のようなファイルをつくって必要な箇所でのみ:elasticsearchを指定して起動してあげるのは、ローカルでテストするときと同様です。

spec/support/elasticsearch.rb

RSpec.configure do |config|
  config.before(:all, :elasticsearch) do
    Elasticsearch::Extensions::Test::Cluster.start(nodes: 1) unless Elasticsearch::Extensions::Test::Cluster.running?
  end

  config.after(:all, :elasticsearch) do
    Elasticsearch::Extensions::Test::Cluster.stop if Elasticsearch::Extensions::Test::Cluster.running?
  end
end

circle.ymlの設定を追加するだけで、ローカルのテストでもCircle CIのテストでも同じコードで動くようになって嬉しいっス。