Herokuでデプロイと同時にrake db:migrateを実行する

  • 40
    Like
  • 0
    Comment

Railsで作ったアプリケーションをHeroku上で動かしているとき、デプロイと同時にrake db:migrateを実行したい場合が多いと思います。

少人数しか使用しない個人用のアプリケーションなどであれば、コードをデプロイした後、ターミナルからheroku run rake db:migrateを手動で実行すれば良いのですが、多くのアプリケーションではそういうわけにはいきません。トレタではサービスの一部にHerokuを使っており、この問題に悩んでいました。

現状だとrake db:migrateを行うHeroku Buildpackを作成して実現している場合が多いようです。

しかし、最近のHerokuにはRelease Phaseという機能があり、これを使って簡単にデプロイと同時にrake db:migrateを実行できます。

Release Phase

Release Phaseを使うには、アプリケーションのリポジトリ内にProcfileを用意します。
Procfileの中にreleaseコマンドを記述すると、その内容をHerokuのreleaseが作成された後に実行します。

例えば、

release: bundle exec rake db:migrate
web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}

というProcfileをリポジトリに追加し、デプロイを行うと、コードがHeroku上にデプロイされた後にrake db:migrateが実行され、pumaが起動します。

所感

今まではデプロイボタンを押すときに少し緊張していましたが、
Procfileに1行追加するだけで、手動rake db:migrateやBuildpackを使うよりも安全なデプロイが実現でき、社内でも非常に重宝しています。
今はまだbeta機能らしいですが、早く正式な機能として公開されて欲しいと思います。