ども、@kimihom です。
今回はステージング環境と本番環境で Heroku アプリを分けていたものを、 Heroku Pipeline でまとめたのでその手順についてご紹介する。
今まで Heroku Pipeline を勘違いしていたんだけど、ステージング環境の Heroku アプリは Heroku アプリの設定を保ったまま残る。つまり、アドオンや、アドオン内で保存されたデータなどはそのまま保たれるということを意味する。ステージング環境と本番環境の切り替えだけの場合は特に大きな変更をすることなく Pipeline へ移行できた。
RAILS_ENV での環境切り替えは非推奨
Rails アプリは、 RAILS_ENV の環境変数によって、読み込みに行く config/environments/~.rb
を変えてくれる。これをうまく利用して、Heroku の RAILS_ENV を staging
にすると、config/environments/staging.rb
を読み込んだ状態でアプリを起動してくれる。また、Rails.env.staging?
といったメソッドを利用できるため、コード内で ステージング環境と本番環境を分けたコードを書くことができる。
ただし、この方法は Heroku では非推奨とされる。このようなアプリを書いて Heroku にデプロイすると、以下のような警告が表示される。
Heroku アプリは全てproduction
環境であるべきとされ、アプリごとの差分は環境変数で管理しなければならない。デプロイするたびにこの警告を見るのは気分がよろしくないから、思い切って同じ Production 環境の Heroku アプリとして Heroku Pipeline に移しつつ、警告が出る問題をクリアしようってわけ。
既存本番アプリに Pipeline を作成
さて、Heroku Pipeline を使ってみよう。Heroku Pipeline を使えば修正内容を ステージング環境でチェックしたら 本番へデプロイするみたいな流れを Heroku と Github のプルリクエストで管理できるようになる。それぞれの Heroku アプリは継続的デリバリーのワークローとして例えば以下のようなステップで表すことができる。
- Review
- Development
- Staging
- Production
ひとまず、本番環境で運用する Heroku アプリの画面から Heroku Pipeline を有効にしよう。
そんで Pipeline の画面に行ったら、Add Existing App
をクリックし、既存で管理してた別のステージング環境のアプリを指定する。
無事追加すると、Heroku のアプリ一覧は以下のような感じに統合される。2 Apps
となって一緒のアプリになった感が出たね!そして Pipeline には Staging でのアプリが表示されるようになった。
本来ならこれで Github と連携すれば、プルリクエストに応じてパイプラインのアプリが Heroku にデプロイされ、Accept すると勝手に Staging から Production へ昇格させたりできるらしいけど、Bitbucket での運用の場合は普通に git push heroku master
とかでデプロイする感じになる。つまり、今までと特に何も変わらないってこと。今後 Heroku の Bitbucket 対応を待つか、諦めて Github にお金を払ってプライベート環境を用意するかになりそうである。
ソースの修正
さて、Bitbucket Pipeline はこのくらいにしておいて、Heroku デプロイの際に表示されるあの忌まわしい Waring を消す作業をしていこう。
これを実施するには、以下のような流れとなる。
config/environments/staging.rb
とconfig/environments/production.rb
の差分を確認- 適宜 環境変数に置き換える
- その他コードで
Rails.env.staging?
のコードを探し、必要に応じて環境変数に置き換える - デプロイ
- ステージングアプリで heroku config:set RAILS_ENV=production を適用
環境ごとの差分は
staging
,production
のif
文で切り替えるのではなく、ENV
環境変数 で切り替えよう。ここはソースを grep しながら、慎重に修正していかないといけない。
1 の environments の切り替えで特にオススメしたいのはログレベルの設定だ。LOG_LEVEL=info
が本番、LOG_LEVEL=debug
がステージングって感じにして config/environments/production.rb
を config.log_level = ENV['LOG_LEVEL'].to_sym
にしておくと何かと便利である。
これでステージング環境に Heroku をデプロイすると、見事警告を消去することができた!Heroku に怒られないようになったのはとても喜ばしいことである。
終わりに
今回は、本番環境とステージング環境を別々で管理していた Heroku アプリケーションを、 Heroku Pipeline 上で一まとまりとして管理できるようにした。さらに個々のアプリを 環境変数で対応するようにすることで、デプロイ時の警告を消去することに成功した。
Heroku Pipeline のより具体的な運用事例に関しては、前回の Heroku Meetup の tambourine の安部さんの発表資料を見るといいと思う。
それでは素敵な Heroku ライフを。