git-pr-releaseというgithub上でリリース用の手順をまとめたPull Requestを簡単に作成できるツールがあります。
このリリースの手順を作る時に、そのリリースPRの変更ファイルの情報を使いたくなったので、そのようなプルリクを送った所mergeされたのでご紹介です。
やりたかったこと
今やっているプロジェクトでは
- DBのマイグレーションツールとかは特に利用せず、db/migrations/以下にALTER TABLE文の書いたファイルを置いておき、手で実行する
- 本番用に一時的に実行したいスクリプトとかをscript/onetime/以下に置いておく
などのことをしているのですが、これを本番リリース時に忘れてしまうことがあります。そういうことをしないために、それらのファイルが変更されたらリリースフローにチェックリストを追加したいと思っていました。
やり方
今回の変更で、erbのテンプレートにリリースPRの変更ファイルの情報が入ったchanged_filesという変数が渡ってくるようになったのでこれを利用します。例えばdb/migrations/以下にファイルが追加された場合にのみチェックリストを作りたいときは
- [ ] masterにmerge
<% if changed_files.any?{|f| f.filename =~ %r{\Adb/migrations/} } # DB系の変更をチェックリストに -%>
- [ ] alter table (`db/migrations/*` が変更されていました)
<% changed_files.select{|f| f.filename =~ %r{\Adb/migrations/} }.each do |file| -%>
- [ ] `<%= file.filename %>`
<% end -%>
<% end -%>
- [ ] `cap deploy`のようにテンプレートに書いておくと、db/migrations/以下のファイルが変更された時だけチェックリストを追加することが出来ます。これで忘れないはず!
ちなみにchanged_filesに入ってくるのは https://developer.github.com/v3/pulls/#list-pull-requests-files のAPIから取れる情報なので、変更行数とかも取ることができます。
まとめ
今回はchanged_filesという変数を利用してリリース手順にフローを動的に追加する方法について紹介しました。本当はデプロイコマンド一発で全て解決出来るといいのですが、様々な事情によりできなかったりするので、こういうのである程度バランスを取ってます。