アトラシエの開発ブログ

株式会社アトラシエのブログです

rackアプリケーションでリビジョンを知らせてくれるrack-git-revision

動作中のRailsアプリケーションのバージョンを確認するためのrack middlewareとしてrack-git-revision というgemを作成しました。

何が嬉しいのか

本番環境にコードをデプロイしたときにそれが正しく反映されているのか、わかりづらいことが意外とあります。その原因として考えられるのが

  • アプリケーションサーバ複数台あるとき、一部のサーバのデプロイに失敗している
  • 本番環境のキャッシュ
  • RAILS_ENV=productionの時だけ発生する不具合(same origin policyなど、javascriptの問題がつまずきがちな気がします)
  • pushやマージを忘れたままデプロイコマンドを実行してしまった

などいろいろとあるのですが、反映をチェックするにはデプロイされているコードのgitのHEADのハッシュを確認することが個人的には多いです。

また、デプロイ権限者が複数いるときに今出ているバージョンがどこまでなのかを把握するためにも本番を直接確認したいことがあると思います。

そこで特定のURLを叩けばリビジョンが返るようにできると嬉しいわけです。

Rack Middlewareについて

ライブラリの紹介だけだと本文が短いので、ついでにRack Middlewareであることのメリットについても触れたいと思います。

そもそもRack Middlewareとは何かですが、このタマネギの層構造が一番有名です。

https://qiita-image-store.s3.amazonaws.com/0/4365/fb04e1b7-2049-0be2-d81f-eefe4e29d6af.png

リクエストが来てレスポンスが返るまでの一本道に、ゲートのようにrack middlewareがあってそれを通過するとリクエスト・レスポンスが加工したり、処理を変更したりできます。 Rackのcallメソッドが実装されたオブジェクトであればrack middlewareになれるようです。

rack middlewareにするメリットとして、場合によって処理を中断したり加工する際にRails本体に手をいれる前に処理が走ったり、Railsから独立して処理がこなせるので疎結合になってメンテナンスしやすいメリットがあるように思います。 ヘッダーに何かを追加するとか、Rails本体で発生する前にRack側で起きるエラーのハンドリングなどです。

一方でRailsアプリから独立していることが前提なので、middlewareからRailsMVCコードを参照したり、そもそもRailsでないと動かないようなコードを書くのはbad patternでしょう。

個人的な意見ですが、rack middlewareは今回のようなライブラリ製作には向くのですが、サービスコードを書く際に使うのは良くない気がします。