はじめに

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あるけど。