開発環境を作るのは大変だ
最近メインで関わっているプロジェクトが必要とするミドルウェアが増えてつらい感じになってきた。
よくあるRailsのプロジェクトでローカルで開発で開発できるようになっていて、ローカルのMySQLに開発用のデータを入れ、動作確認をしながら開発を進めていたんだけども、最近になってelasticsearchやredisも使いたいと開発チームから要望があり、じゃあMySQLと同じようにローカルに開発用のredisとelasticsearchをたてるかーみたいな話になって、実際それで開発環境を作れるようにドキュメントを用意したんだけども、始めてみるといくつかはまることがあって、それを解決するのにvagrantを使ったらいい感じにできたのでまとめてみます。
MacOSX + Rails
よくある開発環境です。ローカルで開発してデプロイするスタイル。
ミドルウェアのバージョンが本番とずれる
ほぼこれに尽きるんだけども、ミドルウェアのバージョンが本番とずれがち。
インストールにhomebrewを使っていることもあって、ごく普通にインストールすると最新バージョンがインストールされる。
これは便利なこともあるけど、本番で使っているバージョンと違うミドルウェアがインストールされると、設定やAPIなどなど微妙に挙動がかわっていたりして、開発環境では問題にならなかったのに、本番環境に持っていくと実は最新バージョンでしか使えない機能でしたーみたいなことがあって困る。
じゃあ、本番環境のミドルウェアも最新バージョンにすればいいじゃんって言われるんだけど、ミドルウェアのバージョンをあげるのはそんなに簡単じゃないことはお察し。誰か助けて。
一応、homebrewでインストールするソフトウェアのバージョンを古いバージョンにすることもできるんだけど、イマイチいけてないよね。
あと、開発に関わる人全員でバージョンをあわせるのって思っているより難しい。みんなのPCがまったく同じようにセットアップされているわけではないので、思わぬところではまったりする。とりあえずbrew doctor
でcleanな状態にはしておいてほしい。(切実)
で、このあたりの調整をとるのがめちゃくちゃ大変なので、いい感じにならないかなーということで、vagrantを使ってVMにのせちゃえばいいじゃんってなるよね。というわけで試すことになるんだけど...
動く...けど!
開発環境を用意するのって大変だし、LinuxのVMを用意してそこに動作に必要なソフトウェアを全部突っ込んでポートフォワーディングで飛ばせばいいじゃん。最高!って思っていたんだけど、実際やってみるとRuby + Railsがもっさりしてとても開発できる感じにはならない。悲しい。
そういうわけであんまりうまくいかないなー、これは無理かーと諦めそうになったんだけど、問題なのはミドルウェアのバージョン固定が難しいっていうだけでRubyは関係ないのではと思って、じゃあミドルウェアだけVMに詰めればいいのではっていうのが今回の思いつき。
MySQL, Redis, elasticsearchをVMに詰める
空のDebianをVMで用意してMySQL、Redis、elasticsearchをインストールしていきます。 空のVMを作る手順はここでは割愛します。
redisはmake && make install
して設定ファイルをおけばとりあえず使える感じ。
elasticsearchはdebパッケージがあるので公式のパッケージからインストールすればとりあえず使えるから便利。
Redis Quick Start
announcing deb and rpm repositories
作っている途中はパッケージのインストールを何度も試すことがあるのでvagrantのsaharaプラグインを使うと便利です。
Sahara
一通り作ったらvagrantのboxにするのがおすすめ。vagrantのboxを作るのは昔qiitaに記事を書いた例の手順でいいと思う。
Vagrantのboxに少しだけ手を加えたものをboxとして取っておきたい
これで作ったboxをチームメンバー間で共有すればそのまま同じミドルウェアが使えるようになるっていう仕組み。
VMとつなぐ
あとはローカルで動かしているRailsのアプリケーションが参照するミドルウェアをVMに向けるだけ。 もちろんポートフォワードにする必要があるので、Vagrantファイルに設定を書く必要がある。 こんな感じでざっくりかけて簡単。
あと、MySQLで少しだけはまって、接続先ホストをlocalhost
にすると、unixドメインソケットで接続しにいってしまうので、config/database.yml
でホストを127.0.0.1
にする必要がある。
後はrails c
して試してみてうまく動くか確認するだけ。できてしまえば簡単ですね。
感想
たったこれだけのことだけど、チーム内で使うミドルウェアのバージョンが一緒になったことで開発環境構築の敷居は結構下がっていて、elasticsearch周りでエラーになるんだけどなんで?みたいな質問がチームメンバーからくることがなくなったし、「Rails遅いぞ!ムキー」ってなっていた開発メンバーも静かになっているので割とうまくいってるんじゃないかなって思う。 もちろんデータの量が多くなれば遅くなるんだろうけど、今のテストデータ規模なら全然速度は気にならないレベルです。
もし、この方法イケてる!って思ったらぜひ試してみてください。
おまけ
スクフェス6500位に入れなかったありふれた悲しみ。あと真姫ちゃんかわいい。