Bocchi Driven Development

こもりはひとりで仕事することが比較的多いんですね(BDD)。で、最近はこんな感じのシステム構成でやることが多いのでそれを紹介してみましょうかね。

Gitで管理しつつ半自動化

ボッチでの作業であってもなくても、仕事に関わるものは基本Gitの管理下に置くようにしています(ローカル)。何かやる時は自分でサーバから用意することが多いのですが、テスト用であっても本番用であってもそのサーバの中でGitを動かすことはありません。

BeanstalkなどのGitのリモートリポジトリにローカルからPushした時、自動的に何かしらのプロトコルでリモートのサーバにデータが転送(デプロイ)されるようにしています。たとえばこのブログの例でいくと、テーマの編集をしてそれを反映させるためにリモートのGitリポジトリにPush。Pushされたら変更分だけがこのブログが動いてるDigitalOceanのサーバに転送されます。残念ながら自分でSFTPとかするより圧倒的に速い。

Ghostの場合、修正したテーマの反映にGhost自身の再起動が必要です。デプロイ時にはそのサービスを再起動するコマンドを自動実行するようBeanstalk側に仕込んでいます。

my-git-flow
Beanstalkは、AWSのElastic Beanstalkではありません。Elastic Beanstalkもサーバの起動はもちろん、更新・再起動もGit一発で勝手にやってくれるのですごく便利です(そっちも使ってます)。

公開は「git push」で

ローカルで逐次Commit & Pushしつつ作業し、Gitでリモートのリポジトリに変更が反映されたら、その内容を自動でサーバにデプロイする(場合によっては手動)。つまるところ、GitでPushするだけで公開に必要な作業がすべて終わるというわけです。基本ひとりですし、そんな複雑な構成のものはないので、テストで動いてれば問題はありません。

こうしておけば、公開用のサーバがいきなり飛んだとしても、ボタン1プッシュですぐ同じものを立ち上げて再デプロイすれば済みます。Gitのリポジトリ自体は、別のリモートサーバにあるので心配いらない&外出先からでも対応可能(Beanstalk側でS3にバックアップも可)。ローカルだろうがリモートだろうが、どこか飛んでも問題なし。

手間がかからないように

今沖縄をベースにやっている業務はチームでの作業です。メンバーそれぞれがBeanstalkのリポジトリをマスターにして各々が変更をPushしますが、誰かがPushすると変更点はコミットログとして自動的にBasecampのスレッドに投稿されるのでそれ見てもOK、という感じ(*1)。他にもBasecampに素材が投稿されれば、それもまた自動でDropboxに放り込まれます(逆もまた然り)。いろいろ連動できるってのはありがたいものです。

AWSやDigitalOceanなどに限ったわけではないですが、最近はボタン1プッシュで簡単にサーバを立ち上げられます。さらにVagrantとかもありますから同じ構成のマシンを作るのはさほど苦ではありません。そんなわけなので、テスト環境でも本番環境でもサーバサイドは極力シンプルにしておいて、自分が手間に感じる部分はそんな費用がかかるわけでもないので、安心・安全をお金で買うことにしています。

(余談)Beanstalkは最近GitHubとかBitBucket、自前のサーバからもデプロイできる「Deploy.io」ってサービスも始めてます。あと同じようなのに「Deploy」ってのもあるようですね、教えていただきました(Thanks, @waviaei)。

*1: 日本だと「Backlog」で似たよなことができるはずですが、残念ながら肌に合わないもので。