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" },
ただ、このやり方にも少し不満がある。それは、Herokuは定期的にDATABASE_URLを値を変えるのだが、その時に手動でSTAGING_DATABASE_URLも書き換えないといけない。このあたりも自動化できないものだろうか。