heroku.ymlを本番稼働中のアプリケーションに適用してみる

Posted on
Heroku
thumbnail

はじめに

以前、Herokuでheroku.ymlなるものが使えるようになったので試してみたのですが、個人開発でHeroku運用しているRailsアプリケーションにもheroku.ymlを導入してみたいと思いちょっと手を動かしてみました。
なお、heroku.ymlはまだdeveloper previewですのでご注意ください。

まずはreview appsで動作確認をしてみる

  • ドキュメントに従ってProcfileを削除して、代わりにheroku.ymlを追加。
  • githubにpushしてreview appを作成します。
  • ただしheroku.ymlを導入する際の手順としてheroku stack:set containerを実行してstackの種類をcontainerにしておく必要があるのでreview appが立ち上がった後にこのコマンドを実行する必要があります。
  • review appが作成された後にstackをcontainerにします。
$ heroku stack:set container --app xxx-xxx-xxxx-pr-143
Stack set. Next release on ⬢ xxx-xxx-xxxx-pr-143 will use container.
Run git push heroku master to create a new release on ⬢ xxx-xxx-xxxx-pr-143.
  • 次のリリースからcontainerになるよと言っているので、このコマンドを実行することで再度stackを変えてアプリを作り直すみたいなことはありませんでした。安心。
  • 再度review appにdeployするとheroku.ymlが有効になってDockerイメージのビルドが始まります。
=== Fetching app code
Sending build context to Docker daemon  569.9kBStep 1/16 : FROM heroku/heroku:16-build as build
16-build: Pulling from heroku/heroku
22dc81ace0ea: Pulling fs layer
...
  • これでheroku.ymlを利用してreview appをデプロイできることが確認できました。

余談:環境変数の設定について

  • ちなみに私のアプリケーションの場合、build中に環境変数を参照している箇所があったのでbuildがコケました。
  • そんなときはheroku.yml内のconfigに環境変数を設定するのですが、ドキュメント通りに書くとbuildが失敗します。
  • 【追記】Herokuのドキュメントが間違っていたらしく、中の人にメールして直してもらいました。やはり環境変数は配列ではなくハッシュで指定するのが正しいようです。
  • 最初にやってみたのは下記のような感じ。

    build:
    languages:
    - ruby
    config:
    - AIRBRAKE_PROJECT_ID: 123456
    ...
    
  • すると下記のようなエラーが出ます。

=== Fetching app code failed
=!= Your heroku.yml isn't valid YAML.
Try validating your YAML and fixing the errors: http://www.yamllint.com/
  • configの引数を配列ではなくハッシュにするとビルドが通りました。

    build:
    languages:
    - ruby
    config:
    AIRBRAKE_PROJECT_ID: 123456
    ...
    

production環境に導入してみる

  • 本番環境に導入したら更新します。

おわりに

実際に動いているアプリに導入してみようと思うとやっぱり色々ありますね。
ここで力尽きたので、本番に導入してみたらまた更新します。