先月、固定 IP アドレス機能を提供する QuotaGuard Static Add-on の Buildpack を作りました。

Buildpack を自作したのは今回が初めてです。

Add-on のドキュメント の通りにインストールすると、バイナリファイルをリポジトリに commit することになります。あまりきれいな方法に思えなかったことが、これらの Buildpack を作った動機です。

Buildpack を作ってみて、それがどのようにインストールされるか興味が湧いたので、詳しく調べてみました。

前準備

今回は Getting Started on Heroku with Node.js のサンプルアプリを使って確認しました。

Heroku App を作成したら、Buildpack に heroku-buildpack-qgsocksify の check ブランチ を指定しつつ、環境変数 HOGE をセットしておきます。

$ git clone https://github.com/heroku/node-js-getting-started.git
$ cd node-js-getting-started
$ heroku create
$ git push heroku master
$ heroku buildpacks:add 'https://github.com/masutaka/heroku-buildpack-qgsocksify#check'
$ heroku config:set HOGE=aaa

Buildpack をインストールする

適当な commit をして 2 回目の git push を行うと、heroku-buildpack-qgsocksify のインストールが始まると同時に、check ブランチに仕込んだログがダラダラと出力されました。出力多めです。読み飛ばしても OK です。

Buildpack の作り方

解説の前に Buildpack の作り方を話しておきましょう。

今回使用した bin/compile を見ると分かりますが、この実行ファイルがあればとりあえず動きます。

第1引数 BUILD_DIR にファイルを作れば、それが Buildpack の生成物となります。割と簡単です。

第2引数 CACHE_DIR には Node.js なら、前回のリリースで作られたキャッシュ、今回は Node.js 関連の metadata や node_modules などが含まれていました。

第3引数 ENV_DIR には 1 つの環境変数が 1 つのファイルとして格納されています。

さらなる情報はドキュメント をどうぞ。

分かったこと

何回か試してみて、分かったことをまとめます。

作業ディレクトリは /app/tmp/buildpacks/{128 byte のハッシュ文字列} で、同じ Heroku App なら毎回同じようだ。
例)/app/tmp/buildpacks/7c5e42d020854a726da281f9febed936c9d7051605dfa836df6b6091f19712beaf921429a7778d44215ea42db515c7066823f5ad87a54aa569aff75babfb73f8

BUILD_DIR は /tmp/build_{32 byte のハッシュ文字列} で、毎回異なるようだ。
例)/tmp/build_aed6ee4b7da0bd979d010dd5136c164d

CACHE_DIR は /app/tmp/cache で毎回同じようだ。

ENV_DIR は /tmp/d{YYYYMMDD}-{2 桁の数字}-{6 byte のハッシュ文字列} で、毎回異なるようだ。
例)/tmp/d20190426-60-1hbiilw

まさに [2018-12-21-1] で説明した、Slug compiler の処理そのものという認識です。

303 行目 Compressing… の生成物が Slug で、305 行目 Launching… で、その Slug を元にして Dyno が起動しています。

まとめ

Heroku Buildpack がどのようにインストールされるのかを調べました。

インストール時のディレクトリ構造を知ることで、Heroku Buildpack を身近に感じられましたし、以前調べた Slug compiler と繋がりました。

おまけ

個人的には QuotaGuard Static 推しですが、世間的には Proximo が知られているようなので、こちらの Buildpack も作ってみました。

https://github.com/masutaka/heroku-buildpack-proximo

QuotaGuard Static のニッチな使い方は以下の記事をどうぞ。Proximo との比較も書きました。