ブログ

読んで思い出す。忘れるために書く

Heroku で環境を立ち上げるたびにデータベースがなくてエラーになる(Rails)

前提

  • Rails アプリケーションを作っていて、Heroku にデプロイしている
  • Review Apps 機能を利用した Pull Request ごとに新しく環境を立ち上げる仕組みを取り入れている

問題

Pull Request を受けて 新規に立ち上げられた環境にアクセスしてみると「Something went wrong.」でページが正常に表示されない

調査

当該環境のログを見てみると以下のようになっている

2018-03-15T03:20:37.329855+00:00 app[web.1]: LINE 1: SELECT "read_laters".* FROM "read_laters"
2018-03-15T03:20:37.329858+00:00 app[web.1]:                                     ^
2018-03-15T03:20:37.329859+00:00 app[web.1]: : SELECT "read_laters".* FROM "read_laters"):
2018-03-15T03:20:37.330081+00:00 app[web.1]: F, [2018-03-15T03:20:37.329987 #4] FATAL -- : [2a96fab4-2749-4022-8c26-580deaa5bf0a]     1: - @read_laters.each do |read_later|
2018-03-15T03:20:37.330085+00:00 app[web.1]: [2a96fab4-2749-4022-8c26-580deaa5bf0a]     2:   p = read_later.url
2018-03-15T03:20:37.330087+00:00 app[web.1]: [2a96fab4-2749-4022-8c26-580deaa5bf0a]     3: 
2018-03-15T03:20:37.330089+00:00 app[web.1]: [2a96fab4-2749-4022-8c26-580deaa5bf0a]     4: = form_tag(read_laters_bulk_push_path)

SQL 発行時点で既にエラーになってるっぽい

解決

試行・検証

Heroku CLI から heroku run rails db:migrate を実行すると問題なくページが表示されるようになった

根本的な解決

Heroku はデプロイするときの段階として Release Phase が用意されているので、そこで db:migrate が走るように設定する

Procfile を用意して、release 時の設定を記述する:

release: bundle exec rails db:migrate

(ドキュメントにもあるように、コマンドだけでなく Shell Script を実行するよう設定してもいい)

Links