This is a simplified, but fairly thorough, set of scripts and configuration to enable Heroku Release Phase for Rails apps.
Further, this particular set up plays nicely with Heroku Review Apps in that the release
phase script will:
- Fail, loudly, if the DB does not yet exist.
- Load the DB schema if the current schema version (as determined by
bin/rails db:version
) is0
. - Run DB migrations otherwise.
For a "normal" app that usually means it will run the DB migrations.
For a Review App, on the first deploy the release
phase will bin/rails db:schema:load
.
And then the postdeploy
script will seed data.
During subsequent deploys to the Review App, the release
phase will bin/rails db:migrate
.
I have one issue that we run in quite frequently: We have two separated apps that share the same code and database. Now when we promote a new build simultaneously to both apps, we get an error sometimes because heroku runs the database migration at the same time, resulting the app deploy to fail on for the app that comes in a split second later (because the migrations are locked).
Any idea how to solve this? It might be possible to specify the app name to run the migration on, but that would be a bit static.