おそらくはそれさえも平凡な日々

その後の俺のオレオレgit-flow〜deployment手法とgit運用

http://togetter.com/li/673629

こういうふうにまとめてくださっていたのですが、自分なりの考えの補足など。

上記でも言及している、「俺のオレオレgit-flow」というエントリにも書きましたが、この運用で進めてみて結構良かったなーと思っている。その辺に関しては以下のツイートしたりした。

最後のリリースフローをpull requestにするっていうのは、naoyaさんのGithub時代のデプロイ戦略を見ていいなーと思ったので取り入れた。

ちなみに、Web UI上で、master -> releaseへのマージボタンを押したところで、メインブランチ(master)に対するdeleteボタンは出現しなかったのでなんとなく精神的に安心であった。

deployment手法とgit運用

僕がプロジェクトをやるときは以下の様なdeploy手法を取る。もちろんある程度スクリプト一発でできるようにしてあるのだが、中身の手順としては以下の様な感じになる。

  1. deploy用のサーバーにログイン
  2. deployサーバーでgit pull
  3. deploy用のサーバーから各appサーバーに対し並列で以下を実行
    1. Rsync
    2. アプリケーションサーバーの再起動
  4. IRCに通知
  5. gitにtagを打ってpushする

各appで並列でgit pullをするというような話も聞くし、その方法でも良いと思うが以下の様なことが気になって、Rsyncを使っている。

  • deploy中(特に並列実行中)にgitサーバーが落ちたら困りそう
  • git gcが走ったらうざそう
  • 本番に配置する必要がない/したくない、ファイルもある(テストファイルとかDebug用のControllerとか。もちろん配置したところで動かないようにはしてあるが)

上の手順の2の場合、何も考えずにreleaseをpullするだけという単純さが良い。

また、releaseブランチには基本的にdeployされたリビジョンしか存在しないというメリットがある。

これはロールバックをするときに非常に楽で、ミスった時にreleaseブランチの一個前のコミットをcheckoutしてRsyncしなおせば切り戻しをすぐにおこなうことができる。

deploy時にDBのスキーマ変更が行われていた場合でも、GitDDLを使ってコミットハッシュとDBのスキーマの状態を紐付けているので、任意のコミットをcheckoutしてその時点のDBスキーマに切り戻すことが可能になっている。幸いにもこのオペレーションが発生したことは無い。

ちなみに、DBのスキーマmigrationに関しては、現状の本番環境と開発環境で差異が発生している時には、ちゃんとmigrationとrollbackが出来るかどうかに関してテストを書いてCIを回すようにしている。

created at
last modified at

2014-05-30T22:05:36+0900

comments powered by Disqus