なんかかきたい

プログラミングなどの個人的なメモやサークル「ゆきいろパラソル」の情報を載せてます

開発環境を作るのは大変だ

最近メインで関わっているプロジェクトが必要とするミドルウェアが増えてつらい感じになってきた。

よくあるRailsのプロジェクトでローカルで開発で開発できるようになっていて、ローカルのMySQLに開発用のデータを入れ、動作確認をしながら開発を進めていたんだけども、最近になってelasticsearchやredisも使いたいと開発チームから要望があり、じゃあMySQLと同じようにローカルに開発用のredisとelasticsearchをたてるかーみたいな話になって、実際それで開発環境を作れるようにドキュメントを用意したんだけども、始めてみるといくつかはまることがあって、それを解決するのにvagrantを使ったらいい感じにできたのでまとめてみます。

MacOSX + Rails

よくある開発環境です。ローカルで開発してデプロイするスタイル。

ミドルウェアのバージョンが本番とずれる

ほぼこれに尽きるんだけども、ミドルウェアのバージョンが本番とずれがち。

インストールにhomebrewを使っていることもあって、ごく普通にインストールすると最新バージョンがインストールされる。

これは便利なこともあるけど、本番で使っているバージョンと違うミドルウェアがインストールされると、設定やAPIなどなど微妙に挙動がかわっていたりして、開発環境では問題にならなかったのに、本番環境に持っていくと実は最新バージョンでしか使えない機能でしたーみたいなことがあって困る。

じゃあ、本番環境のミドルウェアも最新バージョンにすればいいじゃんって言われるんだけど、ミドルウェアのバージョンをあげるのはそんなに簡単じゃないことはお察し。誰か助けて。

一応、homebrewでインストールするソフトウェアのバージョンを古いバージョンにすることもできるんだけど、イマイチいけてないよね。

あと、開発に関わる人全員でバージョンをあわせるのって思っているより難しい。みんなのPCがまったく同じようにセットアップされているわけではないので、思わぬところではまったりする。とりあえずbrew doctorでcleanな状態にはしておいてほしい。(切実)

で、このあたりの調整をとるのがめちゃくちゃ大変なので、いい感じにならないかなーということで、vagrantを使ってVMにのせちゃえばいいじゃんってなるよね。というわけで試すことになるんだけど...

動く...けど!

開発環境を用意するのって大変だし、LinuxVMを用意してそこに動作に必要なソフトウェアを全部突っ込んでポートフォワーディングで飛ばせばいいじゃん。最高!って思っていたんだけど、実際やってみるとRuby + Railsがもっさりしてとても開発できる感じにはならない。悲しい。

そういうわけであんまりうまくいかないなー、これは無理かーと諦めそうになったんだけど、問題なのはミドルウェアのバージョン固定が難しいっていうだけでRubyは関係ないのではと思って、じゃあミドルウェアだけVMに詰めればいいのではっていうのが今回の思いつき。

MySQL, Redis, elasticsearchをVMに詰める

空のDebianVMで用意して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ファイルに設定を書く必要がある。 こんな感じでざっくりかけて簡単。

vagrant middleware vm

あと、MySQLで少しだけはまって、接続先ホストをlocalhostにすると、unixドメインソケットで接続しにいってしまうので、config/database.ymlでホストを127.0.0.1にする必要がある。

mysql2 database.yml

後はrails cして試してみてうまく動くか確認するだけ。できてしまえば簡単ですね。

感想

たったこれだけのことだけど、チーム内で使うミドルウェアのバージョンが一緒になったことで開発環境構築の敷居は結構下がっていて、elasticsearch周りでエラーになるんだけどなんで?みたいな質問がチームメンバーからくることがなくなったし、「Rails遅いぞ!ムキー」ってなっていた開発メンバーも静かになっているので割とうまくいってるんじゃないかなって思う。 もちろんデータの量が多くなれば遅くなるんだろうけど、今のテストデータ規模なら全然速度は気にならないレベルです。

もし、この方法イケてる!って思ったらぜひ試してみてください。

おまけ

スクフェス6500位に入れなかったありふれた悲しみ。あと真姫ちゃんかわいい。