Rails開発環境 2012初夏

Herokuに移行したり、便利なツールを見つけて開発環境を修正したところがあるので「2012初夏バージョン」として拙者の開発環境を晒します。最後にGemfileを載せておきますが、変更したポイントは「Herokuへのデプロイ」「ソースコード公開」「ブラウザのリロードの自動化」の3つです。

Herokuへのデプロイ

VPSでの運用はいい勉強になったものの、以下のような問題がありました。

  • 構築に時間がかかりすぎる。サービス開発への熱が冷めてしまう。プログラムを書くのに専念したい。
  • 既に動いているシステムに支障が出るのが怖くて、新しいツール(例えばSSLとかログサーバーとか監視サーバーとか)を入れられない。
  • セキュリティの問題

なるべくサービスの開発に時間をかけたいので、こうした運用をHerokuに任せてしまうことにしました。デプロイはcapistranoのように設定ファイルを書く必要すらなく、以下のようにとても簡単です。

$ heroku create -s cedar
$ git push heroku master

ステージング環境を使いたい場合もcapistrano-ext入れて云々…みたいなのは必要なく、herokuコマンドで簡単に行えます。

$ heroku create -s cedar -r staging
$ git push staging master

として、別アプリケーションを作ることでステージング環境を作ることができます。

Herokuへの移行に伴って問題となったのが、DBでした。今まではMySQLを使っていたのですが、Herokuでは標準のDBがPostgresqlです。それまでPostgresqlは使ったことがなかったのでHomebrewでインストールしたんですがけっこう苦労しました。Herokuへの移行で環境構築に時間をとられるようではVPSからHerokuに移った意味がなくなってしまうので、ローカルのDBをSQLiteにして本番のみPostgresqlで運用するようにしました。具体的には、database.ymlを以下のように設定しました。

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
  adapter: postgresql
  encoding: unicode
  database: xxx_production
  username: xxx
  password:
  pool: 5
  timeout: 5000

参考

ソースコードの公開

自分の成果物をちゃんと他人に見える形で残そうと思い、ソースコードをGithubに公開するようにしました。公開にあたって問題となるのは、APIキーやステージング環境の認証パスワードといった機密情報の扱いでした。こうした情報をソースコードにハードコーディングせずにアプリケーションを動かす工夫が必要でした。そこで、僕は環境変数にこれらの情報を保存するようにしました。幸い、Herokuでは環境変数を簡単に設定する方法があります。

$ heroku config:add USERNAME=admin PASSWORD=xxx

そして、ローカルの開発環境でこれらの環境変数をロードするための方法としてforemanというgemを使いました。foremanはappサーバーや後述するguardなど複数のプロセスを同時に起動するのに便利なのですが、多くの環境変数をいっぺんにロードするのにも便利です。プロジェクトのルートディレクトリに.envというファイルを用意し、そこに環境変数をセットします。この.envを.gitignoreでgit管理下から除外しておけば、機密情報を公開せずにソースコードを公開することができます。

# Basic auth
USERNAME=admin
PASSWORD=xxx

# S3
S3_ACCESS_KEY=xxx
S3_SECRET_ACCESS_KEY=xxx

foremanを使ってappサーバーを起動する場合は以下のようにします。

$ foreman run rails s

また、Procfileを用意すればguardなど複数のプロセスを一度に起動できます。詳細は参考として載せたリンクを参照してください。

参考

ブラウザのリロードの自動化

viewやscssを編集してデザインを細かく調整する際、なんどもブラウザをリロードするのが煩わしかったのですが、最近便利なツールを見つけました。LiveReloadというツールです。chrome, firefox, safariなど各種ブラウザの拡張機能でLiveReloadをインストールし、guard-livereloadというgemを使うことで、viewやscssの変更が保存されると自動的にブラウザをリロードしてくれます。言葉で説明するより、以下の動画を見た方がわかりやすいです。

感動的ですね!さっそく使いましょう。まずGemfileに追記します。

group :development do
  gem 'guard-livereload'
end

インストールしてGuardfileに設定を加えます。

$ bundle install
$ guard init livereload

あとは、以下の参考のリンクで各種ブラウザにLiveReloadをインストールします。

参考

Gemfile

最後に僕が使っているGemfileの基本型を載せておきますので参考にどうぞ。

source :rubygems

gem 'rails'

# 標準のWebrickよりもパフォーマンスがよく、passengerなどよりも導入が簡単なので採用
gem 'thin'

gem 'haml-rails'
gem 'jquery-rails'

group :assets do
  gem 'sass-rails'
  gem 'coffee-rails'
  gem 'uglifier'
end

group :development, :test do
  # HerokuのためにPostgresqlを入れるのは骨が折れるので開発時はSQLiteを採用
  gem 'sqlite3'

  gem 'rspec-rails'

  # 設定をロードしたサーバーによってテストを高速化する
  gem 'spork'

  # ファイルの変更を検知する。OSX用
  gem 'rb-fsevent'

  # テスト結果をGrowlで通知する
  gem 'growl'

  # ファイルの変更を監視してテストを自動的に実行する
  gem 'guard-rspec'

  # 設定ファイルの変更を監視してテストサーバーを再起動する
  gem 'guard-spork'
end

group :development do
  gem 'heroku'

  # 環境変数をロードして複数のプロセスを実行する作業を自動化
  gem 'foreman'

  # viewやcssの変更を監視してブラウザを自動的にリロードする
  gem 'guard-livereload'

  # デバッガー
  gem 'pry-rails'
end

group :production do
  # Herokuの標準DBはPostgresql
  gem 'pg'
end