はじめに
Herokuでheroku.ymlなるものが使えるようになった(ただしdeveloper preview)ということなのでどんなものなのか調べつつ実際に試してみた。
heroku.ymlとは
かなり推測まじりだが、要点をまとめると下記のような感じだろうか。
- buildとかアプリケーションの起動の設定を一箇所に集約できるmanifestファイル。
- なのでProcfileの代替になりそう。
ただしrelease phaseは今は使えない。release phaseが使えるようになっていました(2018/03/31追記) - aptでインストールできるパッケージを簡単にインストール可能。なのでbuildpackを代替するものになる…のかも。
- heroku.ymlを使用するときは「stackをcontainerにしてね」とあるのでアプリケーションはDockerベースになる。
- Container Registryはreview appsが使えないが、heroku.ymlを使うとreview appsが使える。
- app.json(review appで使うやつ)もheroku.ymlに集約されていきそうな予感。
- RubyとJavaのみサポート(2018/03/27現在)
設定はコード化していきたいので、個人的にはうれしい。
実際に試してみた
- 試しにRailsアプリをデプロイするチュートリアル通りにやってみた。
- 手順はリンク先で確認していただくとして、気になるのは
git push heroku master
した後にどんなログが流れるのか。
$ git push heroku master
Counting objects: 342, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (192/192), done.
Writing objects: 100% (342/342), 65.61 KiB | 65.61 MiB/s, done.
Total 342 (delta 128), reused 336 (delta 125)
remote: Compressing source files... done.
remote: Building source:
remote: === Fetching app code
remote: Sending build context to Docker daemon 141.8kB
remote: Step 1/13 : FROM heroku/heroku:16-build as build
remote: 16-build: Pulling from heroku/heroku
remote: 22dc81ace0ea: Pulling fs layer
remote: 1a8b3c87dba3: Pulling fs layer
remote: 91390a1c435a: Pulling fs layer
...
remote: c1468dcaa575: Pull complete
remote: Digest: sha256:48efb5a0773b7f9a8259b71c09ae5dd4ac173845ee3741a359c5e81396730d11
remote: Status: Downloaded newer image for heroku/heroku:16-build
remote: ---> f0691bf64d5d
- Dockerですね。
remote: Step 2/13 : COPY . /app
remote: ---> de0cbf2b237c
remote: Step 3/13 : WORKDIR /app
remote: ---> 139fdaa26dff
remote: Removing intermediate container 5ca496c9be99
remote: Step 4/13 : RUN mkdir -p /tmp/buildpack/ruby /tmp/build_cache /tmp/env
remote: ---> Running in b301d54891f6
remote: ---> e9f1410f9647
remote: Removing intermediate container b301d54891f6
remote: Step 5/13 : RUN curl https://codon-buildpacks.s3.amazonaws.com/buildpacks/heroku/ruby.tgz | tar --warning=none -xz -C /tmp/buildpack/ruby
remote: ---> Running in 1401d55dbdc4
remote: % Total % Received % Xferd Average Speed Time Time Time Current
remote: Dload Upload Total Spent Left Speed
remote: 100 34.3M 100 34.3M 0 0 25.6M 0 0:00:01 0:00:01 --:--:-- 25.6M
remote: ---> e81a3112b339
remote: Removing intermediate container 1401d55dbdc4
- heroku/rubyのbuildpackをダウンロードしている。
remote: Step 6/13 : RUN STACK=heroku-16 /tmp/buildpack/ruby/bin/compile /app /tmp/build_cache /tmp/env
remote: ---> Running in a01507c7c4a4
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.3.5
remote: -----> Installing dependencies using bundler 1.15.2
remote: Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
...
remote: Bundle complete! 12 Gemfile dependencies, 63 gems now installed.
remote: Gems in the groups development and test were not installed.
remote: Bundled gems are installed into ./vendor/bundle.
remote: Bundle completed (28.07s)
remote: Cleaning up the bundler cache.
remote: Warning: the running version of Bundler (1.15.2) is older than the version that created the lockfile (1.15.4). We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
remote: The latest bundler is 1.16.1, but you are currently running 1.15.2.
remote: To update, run `gem install bundler`
remote: -----> Installing node-v6.11.1-linux-x64
remote: -----> Detecting rake tasks
remote: -----> Preparing app for Rails asset pipeline
remote: Running: rake assets:precompile
...
remote: Asset precompilation completed (5.27s)
remote: Cleaning assets
remote: Running: rake assets:clean
remote:
remote: ###### WARNING:
remote: No Procfile detected, using the default web server.
remote: We recommend explicitly declaring how to boot your server process via a Procfile.
remote: https://devcenter.heroku.com/articles/ruby-default-web-server
remote:
remote: ---> 858253f8ff2a
remote: Removing intermediate container a01507c7c4a4
- bundle installからのassets:precompile。
remote: Step 7/13 : FROM heroku/heroku:16
remote: 16: Pulling from heroku/heroku
...
remote: Status: Downloaded newer image for heroku/heroku:16
remote: ---> f1edc3f5be9d
remote: Step 8/13 : COPY --from=build /app /app
remote: ---> dc5a426f4f45
remote: Step 9/13 : ENV HOME /app
remote: ---> Running in 1d4e2b082f4c
remote: ---> 77407c14273b
remote: Removing intermediate container 1d4e2b082f4c
remote: Step 10/13 : WORKDIR /app
remote: ---> ed5583f6a413
remote: Removing intermediate container 54c0eccc561a
remote: Step 11/13 : RUN useradd -m heroku
remote: ---> Running in 4d51351e7516
remote: ---> a832757c4926
remote: Removing intermediate container 4d51351e7516
remote: Step 12/13 : USER heroku
remote: ---> Running in b4bacbce604d
remote: ---> 4983e59f465d
remote: Removing intermediate container b4bacbce604d
remote: Step 13/13 : CMD bundle exec puma -C config/puma.rb
- CMDにheroku.ymlの
run:
で記述したものが設定されているのだと思う。
remote: ---> Running in 6e82995eabf5
remote: ---> 69284ef30cb1
remote: Removing intermediate container 6e82995eabf5
remote: [Warning] One or more build-args [SOURCE_VERSION] were not consumed
remote: Successfully built 69284ef30cb1
remote: Successfully tagged dcfbe4bc3cde1cfb8d503a2d85642**********:latest
remote: Login Succeeded
remote: Tagged image "dcfbe4bc3cde1cfb8d503a2d85642**********" as "registry.heroku.com/*****-*****-*****/web"The push refers to a repository [registry.heroku.com/*****-*****-*****/web]
...
remote: Verifying deploy... done.
To https://git.heroku.com/*****-*****-*****.git
* [new branch] master -> master
- heroku.ymlを元にimageをビルドして、それをherokuにデプロイしているようだ。
感想
- Dockerfileを書くほどでもないんだけど、追加でpackageを入れたい場合はbuildpackを使うよりも簡単そう。
- Heroku的にはこれをメインにしていきたいのだろうか。
- app.jsonはheroku.ymlに統合してほしいし、add-onもここに記述できるようになるとうれしい。terraformあるけど。