Heroku の postdeploy が動作しない原因
一言でわかる結論
postdeploy
はアプリの作成後に一度だけ実行される!
これですべてを理解した場合は、これより先は読まなくても大丈夫。
原因と理由
Heroku では、リポジトリルートに app.json
というファイルを作成し、その中にいろいろ記述することで Heroku 上でのデプロイ方法を指定することができる。
その中に postdeploy
というものがある。これを利用することにより、Heroku 上でアプリがデプロイされたときに任意のコマンドを実行することができる。
{
// 省略
"scripts": {
"postdeploy": "RAILS_ENV=production bundle exec rails db:create && RAILS_ENV=production bundle exec rails db:migrate && RAILS_ENV=production bundle exec rails assets:precompile"
}
// 省略
}
上記の例では、Rails アプリケーションで、データベースを新規作成し、マイグレーションを実行し、アセットのプリコンパイルを実行している。
このようにアプリケーションのデプロイ後に任意のコマンドを実行できる便利な仕組みなのだが、いくら app.json
を書き直しても動作しない。
その理由は、postdeploy
はアプリの作成後に一度だけしか実行されないからである。つまり、一度デプロイされてから app.json
を書き換えても、その内容は反映されないということ。
変更を反映させたい場合は、アプリを作成し直す必要がある。Review apps を利用している場合は、一度 PR をクローズして再オープンすることでアプリを再作成することができる。
余談
ちなみに、https://dashboard.heroku.com/apps/<APP_NAME>/app-json
にアクセスすると、Output
というセクションに JSON ファイルがある。
この画面にある JSON は、app.json
に似て非なるものであるようだ。
Heroku 画面の Output
|
---|
app.json |
---|
この画面上の JSON の "scripts"
の中身が空 ({}
) になっていたとしても、app.json
で正しく記述されており、かつ、アプリの初回作成時であれば、"scripts"
("postdeploy"
) の中身が正しく実行されるはずだ。
Discussion