Container RegistryでもReview Apps使いたいなーと思っていたら、heroku.yml使えばいけそうと気付いたので翻訳する
https://devcenter.heroku.com/articles/heroku-yml-build-manifest
heroku.yml - 新しいビルド方式(開発者レビュー中)
heroku.ymlはアプリケーションのビルドを定義するための新しい方式です。現在(4/26時点)は開発者プレビュー中で、今後のロードマップのためにも皆さんの手助けがあるとうれしいです。ぜひフィードバックを送ってください。
heroku.ymlを使うと、
- ひとつの方式でアプリケーションビルドの定義ができる
-
aptからのパッケージ追加が容易にできる - コンパイル(ビルド)前後に実行したいコマンドを定義できる
- Dockerベースのアプリケーションでも
Review Appsが使える - Herokuに自分でビルドしたDockerイメージをデプロイできる
heroku.ymlは、Ruby、Java、そしてDockerベースのアプリケーションをサポートしています。
Getting started - 既存のアプリケーション
まず、自分のアプリケーションのルートディレクトリにheroku.ymlファイルを作成します。サンプルとしてRubyアプリケーションの例です。
build:
languages:
- ruby
packages:
- imagemagick
config:
RAILS_ENV: development
release:
command:
- rake db:migrate
run:
web: bundle exec puma -C config/puma.rb
git commitします。
$ git add heroku.yml
$ git commit -m "Add heroku.yml"
Herokuアプリケーションのstack設定をcontainerに変更します。
$ heroku stack:set container
そして、Herokuアプリケーションにgit pushしてください。
$ git push heroku master
アプリケーションは新しいビルドサービスで構築され、Procfileではなくheroku.ymlファイルのrunコマンドを実行します。
Getting started - 新しいアプリケーション
サンプル用のリポジトリをgit cloneします。
$ git clone https://github.com/heroku/ruby-getting-started.git
$ cd ruby-getting-started
プロジェクトのルートディレクトリにheroku.ymlファイルを作成します。
build:
languages:
- ruby
run:
web: bundle exec puma -C config/puma.rb
Procfileを削除(任意)して、heroku.ymlファイルをgit commitします。
$ rm Procfile
$ git rm Procfile
$ git add heroku.yml
$ git commit -m "Added heroku.yml and removed Procfile"
次に、stack設定をcontainerにして新しいアプリケーションを作成します。
$ heroku create your-app-name --stack=container
データベース(無料)を追加します。
$ heroku addons:create heroku-postgresql:hobby-dev
プロジェクトをgit pushします。
$ git push heroku master
アプリケーションは新しいビルドサービスで構築され、Procfileではなくheroku.ymlファイルのrunコマンドを実行します。
最後に、アプリケーションにアクセスします。
$ heroku open
ビルドの定義
言語設定について
heroku.ymlはRubyとJavaアプリケーションの構築をサポートしており、別言語のサポートも予定しています。
build:
languages:
- ruby
build:
languages:
- java
コンパイル(ビルド)前後のコマンド実行について
heroku.ymlのpreとpostでは、languagesで設定した言語のコンパイル(ビルド)の前後で実行されます。(Dockerfileビルドでは、pre、postは無視されます)shellコマンド数に制限はなく、すべて実行します。
build:
languages:
- ruby
pre:
- curl https://sh.rustup.rs -sSf | sh -s -- -y
post:
- fortune | tee -a banner.txt
aptからのパッケージインストールについて
heroku.ymlのpackagesでは、aptからインストールするパッケージを定義します。
build:
packages:
- imagemagick
ビルド時の環境変数について
heroku.ymlのconfigでは、ビルド中に使う環境変数を設定できます。
build:
config:
RAILS_ENV: development
FOO: bar
ここで設定した環境変数は、アプリケーション実行中の環境変数にはなりません。
Dockerイメージのビルド
Dockerイメージでアプリケーションを実行できるようにする場合は、heroku.ymlにDockerfileを設定することができます。heroku.ymlにDockerfileの相対パスを指定してください。
build:
docker:
web: Dockerfile
worker: worker/Dockerfile
Dockerfileを設定すると、新しいビルドサービスでdocker buildしてデプロイします。アプリケーションの実行にはCMDで指定したコマンドを実行します。
リリースフェーズ
リリースフェーズでは、新しいリリースが本番環境にデプロイされる前にコマンドを実行できます。(例えば、CSS/JS/assetsをCDNに送信、キャッシュストア、データベースのマイグレーション)
リリースフェーズコマンドの定義は、heroku.ymlのreleaseにコマンドを指定します。
build:
...
release:
command:
- rake db:migrate
run:
web: bundle exec puma -C config/puma.rb
Dockerfileでビルド定義している場合は、コマンド実行に使うDockerイメージを指定することもできます。
build:
docker:
web: Dockerfile
worker: worker/Dockerfile
release:
image: worker
command:
- ./deployment-tasks.sh
リリースフェーズのログを確認したい場合は、Dockerイメージにcurlをインストールしなければいけません。インストールしていない場合は、アプリケーションログにリリースフェーズのログを表示します。もし、heroku/heroku:16イメージを使っているなら、curlはインストール済です。
実行プロセスの定義
runでは、アプリケーションの起動時に実行したいコマンドを設定できます。プロジェクト内にProcfileもあった場合は、Procfileは無視して、runのコマンドを実行します。
build:
languages:
- ruby
run:
web: bundle exec puma -C config/puma.rb
Dockerの場合
Dockerを使う場合、Dockerfileで指定したCMDのコマンドを実行し、heroku.ymlのrunコマンドは無視します。Dockerイメージを使った場合の要件詳細については、Container Registry and Runtime documentationを確認してください。
Review Appsとapp.json
heroku.ymlを使っていて、Review Appsを利用する場合はapp.jsonファイルが必要です。将来的にapp.jsonはheroku.ymlに統合する予定です。(app.jsonはいらなくなります)
必ず、app.jsonのstack設定でcontainerに設定してください。
既知の問題と制限事項
- Revie Appsはサポートしていますが、
pipeline promotionsはサポートしていない - RubyとJavaをサポートしている