tDiaryをHeroku pipelineで動かせるようにした
HerokuにはHeroku pipelineという機能がある。Githubと連携して、プルリクエストのたびに自動的にHerokuのインスタンスを生成してくれる。わざわざブランチをローカル環境に持ってきて動かす手間が省けるのでとても便利な機能。この機能を使うためには、masterブランチ(プルリクエストの元になるブランチ)がHerokuへのデプロイに対応している必要がある。
tDiaryはこれまで、Herokuへのデプロイはheroku専用ブランチのみ対応していた。これは、Heroku独自の設定 (揮発性環境に対応するため日記データをMongoLabに保存するためのgemの追加や特有のtdiary.confファイルの配置など) を加えているため。Heroku pipelineを使いたかったので、tDiaryのmasterブランチでもHerokuへデプロイできるようにした。
要はHeroku特有に用意したファイル (Gemfile.local, Gemfile.lock, tdiary.conf, あとは専用の更新用プラグイン) を差し替えるだけ。ところが、Herokuのapp.jsonファイルではデプロイ後に動かすスクリプトはpostdeployとして指定できるが、デプロイ前のスクリプトは指定できない。しかたがないので、デプロイ時に動かすHerokuのbuildpackをカスタマイズすることにした。
はじめは公式のruby用buildpackをforkしてみたが、これが内部的に結構複雑なことをやっている。もう少し調べていたらデプロイ時には複数のbuildpackを指定できることがわかったので、ファイルをコピーするだけのbuildpackを書いて、公式のruby用buildpackと併用することにした。buildpackの中身は単純なシェルスクリプト。久しぶりにシェルスクリプトを書いたよ。
これでプルリクエストのたびにHerokuへ自動デプロイされるようになり、 tDiary の開発がもっとはかどるようになった。よかった。