Heroku Pipelineでステージング環境のDBをReview Appsにコピー

現在開発が継続中のシステムがあるのだが、Heroku上で稼働している。
先日セールスフォースの阿部さんのWebinarでそのHerokuのPipelineについて知る機会があり、感動のあまり早速取り入れることにした。それと同時に開発フローをGitHubフローに変更。このあたりは、Herokuとチーム開発のおいしいレシピ~HerokuとGitHubを連携してCI/CDを実現する (1/5):CodeZine(コードジン)の記事に詳しい。実際、ボクが受けたWebinarはこの記事をベースにしたものだった。
もともとテスト環境用にappを用意していたので、それをステージング用に設定すればPipelineが完成。
ところが少し問題が。ステージング用appはもともとテスト用なのでDBが完備されている。一方、この環境をベースにしたReview Appsの方はDBが整備されていない。もちろん、Heroku Postgresのadd-onは追加され、DATABASE_URLも個別のものが設定されているが肝心の中身がないのだ。
そこで、Review Appsが作成される際に、ステージング用appからDBの中身をコピーするようにしなければならない。このことは、こちらのマニュアルの注意書きにちゃんと書かれている。
試行錯誤の結果、以下のようにしたらできた。

  • ステージング環境に環境変数STAGING_DATABASE_URLを用意し、DATABASE_URLの内容をコピー。
  • Review Appsではその内容を引き継げるようにapp.jsonに記述。これは、

    "env": {
        "STAGING_DATABASE_URL": {
          "required": true
        },

    のように記述する。


  • app.jsonのpostdeployスクリプトにDBのコピーコマンドを記述する。

    "scripts": {
       "postdeploy": "pg_dump $STAGING_DATABASE_URL | psql $DATABASE_URL"
    },


これで、ステージング環境のDBが丸ごとコピーされる。
ただ、このやり方にも少し不満がある。それは、Herokuは定期的にDATABASE_URLを値を変えるのだが、その時に手動でSTAGING_DATABASE_URLも書き換えないといけない。このあたりも自動化できないものだろうか。