🦁

Heroku の postdeploy が動作しない原因

2022/03/10に公開

一言でわかる結論

postdeploy はアプリの作成後に一度だけ実行される!

これですべてを理解した場合は、これより先は読まなくても大丈夫。

原因と理由

Heroku では、リポジトリルートに app.json というファイルを作成し、その中にいろいろ記述することで Heroku 上でのデプロイ方法を指定することができる。

その中に postdeploy というものがある。これを利用することにより、Heroku 上でアプリがデプロイされたときに任意のコマンドを実行することができる。

app.json
{
  // 省略
  "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") の中身が正しく実行されるはずだ。

参考サイト

GitHubで編集を提案

Discussion