-
Notifications
You must be signed in to change notification settings - Fork 9
Rails3
このクイックスタートは、Cedar stack上の Rails 3.x より開始します。 Rails 3.1ガイドは、こちらです。http://devcenter.heroku.com/articles/rails31_heroku_cedar Sinatraまたは、その他Rubyアプリは、Ruby quickstartを参照して下さい。
- Ruby/Railsの基礎知識、Ruby 1.9.2, Rubygems, Bundler, Rails 3がインストール済みであること。
- Gitの基礎知識
- アプリケーションは、 Ruby (/wiki/MRI) 1.9.2上で実装する必要があります。
Heroku Toolbeltをローカル端末へインストールして下さい。 インストールすることで、Heroku command-line client、 Foreman、Gitのリビジョン管理システムへのアクセスが保証されます。
一度、インストールを行うと、シェルからheroku
コマンドを使用することが出来るようになります。
Herokuアカウント作成時のemailアドレスとパスワードを使用してログインして下さい。(以下、実行例)
:::term
$ heroku login
Enter your Heroku credentials.
Email: adam@example.com
Password:
Could not find an existing public key.
Would you like to generate one? [Yn]
Generating new SSH public key.
Uploading ssh public key /Users/adam/.ssh/id_rsa.pub
コマンドプロンプト画面にて、既存のsshキーをアップロードする、または、新規sshキーの作成を行いますので、 enterキーを押して下さい。sshキーは、コードをHerokuへpushする際に使用されます。
既存のアプリから始めることになるでしょうが、既存のアプリが存在しない場合、一般的なRails3アプリがサンプルアプリとして 最適でしょう。(以下、作成例):
:::term
$ rails new myapp
$ cd myapp
Herokuは、PostgreSQLのデータベースを提供するため、Gemfile
の以下の箇所を編集して下さい。:
(追記:Rails3のデフォルトデータベースは、SQLiteのため)
:::ruby
gem 'sqlite3'
上記内容をこちらに変更:
:::ruby
gem 'pg'
依存関係を再インストールします。(新たにGemfile.lock
を作成するため):
:::term
$ bundle install
$ git init
$ git add .
$ git commit -m "init"
Cedar stack上へアプリの作成:
:::term
$ heroku create --stack cedar
Creating severe-mountain-793... done, stack is cedar
http://severe-mountain-793.herokuapp.com/ | git@heroku.com:severe-mountain-793.git
Git remote heroku added
コードをディプロイ:
:::term
$ git push heroku master
Counting objects: 67, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (52/52), done.
Writing objects: 100% (67/67), 86.33 KiB, done.
Total 67 (delta 5), reused 0 (delta 0)
-----> Heroku receiving push
-----> Rails app detected
-----> Installing dependencies using Bundler version 1.1
Checking for unresolved dependencies.
Unresolved dependencies detected.
Running: bundle install --without development:test --path vendor/bundle --deployment
Fetching source index for http://rubygems.org/
Installing rake (0.8.7)
...
Installing rails (3.0.5)
Your bundle is complete! It was installed into ./vendor/bundle
-----> Rails plugin injection
Injecting rails_log_stdout
Injecting rails3_serve_static_assets
-----> Discovering process types
Procfile declares types -> (none)
Default types for Rails -> console, rake, web, worker
-----> Compiled slug size is 8.3MB
-----> Launching... done, v5
http://severe-mountain-793.herokuapp.com deployed to Heroku
To git@heroku.com:severe-mountain-793.git
* [new branch] master -> master
作成されたアプリをウェブ上で閲覧する前に、アプリのプロセスの状態を確認しましょう:
:::term
$ heroku ps
Process State Command
------------ ------------------ ------------------------------
web.1 up for 5s bundle exec rails server -p $PORT
webプロセスが起動しています。ログでより詳細な情報をレビューしてみましょう:
:::term
$ heroku logs
2011-03-10T11:10:34-08:00 heroku[web.1]: State changed from created to starting
2011-03-10T11:10:37-08:00 heroku[web.1]: Running process with command: `bundle exec rails server -p 53136`
2011-03-10T11:10:40-08:00 app[web.1]: [2011-03-10 19:10:40] INFO WEBrick 1.3.1
2011-03-10T11:10:40-08:00 app[web.1]: [2011-03-10 19:10:40] INFO ruby 1.9.2 (2010-12-25) [x86_64-linux]
2011-03-10T11:10:40-08:00 app[web.1]: [2011-03-10 19:10:40] INFO WEBrick::HTTPServer#start: pid=12198 port=53136
2011-03-10T11:10:42-08:00 heroku[web.1]: State changed from starting to up
いい感じです。heroku open
コマンドで、webアプリを訪問することが出来ます。
Cedarは、あなたのアプリの環境で試験を行えるようにするために、ローカルターミナルからRailsのコンソールを使用可能とします:
:::term
$ heroku run console
Running `bundle exec rails console` attached to terminal... up, ps.1
Loading production environment (Rails 3.0.4)
irb(main):001:0>
レイクはコンソールと同様に付加プロセスとして実行することが出来ます:
:::term
$ heroku run rake db:migrate
デフォルトで、rails server
コマンドで使用されるWebサーバーは、Webrickとなります。これはテスト環境では良いかもしれません。
ですが、本番環境ではもっと堅牢なWebサーバーへ切り替えたくなるかもしれません。我々は、Thinを推奨します。
ThinをRails3で使用するには、Gemfileへ以下のものを追加して下さい。:
:::ruby
gem 'thin'
bundle install
コマンドを実行し、ローカルのバンドルをセットアップして下さい。
Procfileを以下のようにクリエイトすることで、webプロセスを起動するために使われるコマンド(rails server
)
を変更して下さい。:
web: bundle exec rails server thin -p $PORT -e $RACK_ENV
あなたの環境のRACK_ENV
へ開発用(development)をセットして下さい。
$ echo "RACK_ENV=development" >>.env
Foremanを使い、ローカルでプロックファイルをテストして下さい。
$ foreman start
11:35:11 web.1 | started with pid 3007
11:35:14 web.1 | => Booting thin
11:35:14 web.1 | => Rails 3.0.4 application starting in development on http://0.0.0.0:5000
11:35:14 web.1 | => Call with -d to detach
11:35:14 web.1 | => Ctrl-C to shutdown server
11:35:15 web.1 | >> Thin web server (v1.2.8 codename Black Keys)
11:35:15 web.1 | >> Maximum connections set to 1024
11:35:15 web.1 | >> Listening on 0.0.0.0:5000, CTRL+C to stop
いい感じです。さて、Ctrl-Cを押して、exitしましょう。 変更をHerokuへディプロイしましょう。:
$ git add .
$ git commit -m "use thin via procfile"
$ git push heroku
ps
コマンドで確認して下さい。webプロセスが、Thinをwebサーバーとして使用していることを確認出来るでしょう:
:::term
$ heroku ps
Process State Command
------------ ------------------ ------------------------------
web.1 starting for 3s bundle exec rails server thin -p $..
ログにもThinを使用していることが反映されています:
:::term
$ heroku logs
2011-03-10T11:38:43-08:00 heroku[web.1]: State changed from created to starting
2011-03-10T11:38:47-08:00 heroku[web.1]: Running process with command: `bundle exec rails server thin -p 34533`
2011-03-10T11:38:50-08:00 app[web.1]: => Booting Thin
2011-03-10T11:38:50-08:00 app[web.1]: => Rails 3.0.4 application starting in production on http://0.0.0.0:34533
2011-03-10T11:38:50-08:00 app[web.1]: => Call with -d to detach
2011-03-10T11:38:50-08:00 app[web.1]: => Ctrl-C to shutdown server
2011-03-10T11:38:50-08:00 app[web.1]: >> Thin web server (v1.2.7 codename No Hup)
2011-03-10T11:38:50-08:00 app[web.1]: >> Maximum connections set to 1024
2011-03-10T11:38:50-08:00 app[web.1]: >> Listening on 0.0.0.0:34533, CTRL+C to stop
2011-03-10T11:38:55-08:00 heroku[web.1]: State changed from starting to up
Herokuへディプロイする際、Rails 3.1+ asset pipeline の呼び出しには、いくつかのオプションがあります。 詳細は、Rails 3.1+ Asset Pipeline on Heroku Cedar を参照して下さい。
アプリをプッシュしたけれども、それがクラッシュしてしまった場合(heroku ps
コマンドがcrashed
の状態を返す場合)、
何が悪いのかを発見するために、ログを確認して下さい。
もし、ソースファイルのrequireに失敗する場合、ローカル環境でRuby 1.9.1、または1.8を使用しているのであれば、 解決する可能性が高いです。ロードパスがRuby 1.9で変更となっています。あなたのアプリをRuby 1.9.2へ移行して下さい。 Cedarへプッシュする前にローカルで動作することを確認して下さい。
Ruby 1.9では、より洗練されたエンコーディングサポートを機能付加しています。全てのgemsがRuby 1.9で動作するわけではありません。 (特定のgemの情報は、こちらを参照して下さい。isitruby19) もし、エンコーディングのエラーが発生するのであれば、あなたのローカル環境で、Ruby 1.9.2を使用した十分なテストが行えていません。 あなたのアプリをRuby 1.9.2へ移行して下さい。Cedarへプッシュする前にローカルで動作することを確認して下さい。
もし、gemの紛失により、アプリがクラッシュしてしまった場合、ローカルでは、そのgemをインストールしているものの、
Gemfile
の中に明記されていない可能性があります。**全てのローカル上でのテストは、bundle exec
コマンドを使用し、
分離する必要があります。例えば、ruby web.rb
と実行するのではなく、bundle exec ruby web.rb
と実行して下さい。
rake db:migrate
と実行するのではなく、bundle exec rake db:migrate
と実行して下さい。
その他のアプローチとして、どのインストール済みのgemsにも触れていないことを確実にするために、 ブランクのRVM gemsetをクリエイトする方法があります。:
:::term
$ rvm gemset create myapp
$ rvm gemset use myapp
それでも、ディプロイ時にgemが紛失するのであれば、Bundlerのグループを確認してみて下さい。Herokuでは、 開発やテストのグループ無しで、アプリを構築します。あなたのアプリが、これらのグループのgemに依存しているのであれば、 そのgemをこれらのグループから取り除いて下さい。
Rakefile
内のRSpecタスクを使った一般的な例を挙げてみます。Herokuへのディプロイ時にこれを見ることがあるなら:
:::term
$ heroku run rake -T
Running `bundle exec rake -T` attached to terminal... up, ps.3
rake aborted!
no such file to load -- rspec/core/rake_task
次にこの問題にも遭遇するでしょう。最初に、以下のようにローカルでも同様の問題を発生させて下さい:
:::term
$ bundle install --without development:test
...
$ bundle exec rake -T
rake aborted!
no such file to load -- rspec/core/rake_task
gemロード時に、これらのRakeタスクを条件付きにすることで、この問題をフィックス出来ます。例えば:
:::ruby
begin
require "rspec/core/rake_task"
desc "Run all examples"
RSpec::Core::RakeTask.new(:spec) do |t|
t.rspec_opts = %w[--color]
t.pattern = 'spec/*_spec.rb'
end
rescue LoadError
end
ローカルで動作することを確認した上で、Herokuへプッシュして下さい。