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をサポートしている