開発ネットワーク

dev_networkいろいろ考えて経験的にはこんな感じになるかと思っています。
開発に恐ろしい人数が関わっている場合があって、こういう場合はその統制やマネージメントのスキルというよりもむしろちゃんとしたインフラやネットワークがあるという方がよほどリスクヘッジになるのではないかというのが私の考え方です。これは何となく政治とか法律とかと似ていてどんなに頑張ってもなかなか独裁政治ができないようになっている…みたいな、そもそもの構造というかそういうものが土台として必要であるというわけです。議員内閣制とか間接選挙とかいろいろ。
開発というのはおもしろいもので、おそろしいほどの誤解の上で成り立っています。トップとボトムではおそろしく世界が違います。それは認識の差、技術の差、理解度の差、視座の差、いろいろありますが、それぞれのレイヤーでの特有の解釈があります。それらを必要な分だけ共有するという仕組みをつくることが大切であるというわけです。

開発Loacal 開発server ステージング 本番

状況が許せばこの4環境が必要です。この4環境の接続方法をいろいろ検討していると、このようなかたちに落ち着きます。
開発者にとっては、dev環境と自分のPCがあればよいという感じです。またWordpressとかrailsとかCakePHPとかLaravelとかではDBが必須みたいなことになってきているのでDBをどうするのかということになります。DBはdump&restoreで都度手作業でやるというのは非常に効率が悪い。なのでDBというのは性格上、設計が終わってしまえばほぼほぼ最後まで大きな構造変更がないという前提条件であれば、dev環境のDBをローカルのPC上のソースが読み込んで共有するというのがいちばんよいかなと思います。ユーザー認証とかもPC上で作成したユーザーがdev環境で再登録しないといけないといった無駄な作業が減るからです。稀にDBに手を入れないといけない場合は手動で修正していかないとダメです。
ステージングと本番環境は通常十中八九はミラーリングされているのが好ましいです。というのもステージングをテストに使ってはいけないということです。フルスペック開発ネットワーク(仮称)というものが世の中にあるとすれば、ステージング環境と開発環境の間にtest環境というものがあるとよいわけです。いわゆるテスターはテスト仕様書とテスト環境のみがあればよいわけで、そのフィードバックで開発領域とやりとりができると思います。ステージングサーバーはテストに用いないというのが開発のコツです。

本番

運用環境です。基本rsyncのコマンド以外で触ることなし。おそらく調査は山ほどするでしょう。
ステージング環境からファイルやデータが上がってきます。

ステージング

運用環境とソースは一致している場所。DBのトランザクションデータは全く違ってもよいか。。というか違うか。普通。
ここは本番環境と常に一致させておくことがコツです。開発環境でよしとしたものだけあがってきます。

開発server

各人の開発がここに寄せられて一つにするところです。基本Gitで管理してpullするだけというのが理想です。mergeやrebaseは各個人が責任をもってやりましょう。
remoteリポジトリとつながっているだけで、WinSCPとかで上げるのは正直気持ちがわるいです。というかWinSCP禁止。

開発local

むちゃくちゃやっていいけど、commitするときはきれいにしてくださいね、というルール。

rsync

単にrsyncするだけだといろいろ面倒なことが起こりそうなので、rsyncの際には以下4つのことを同時に行っておくのがよいです。

  • 現状のローカルファイルのバックアップ(tarとかしておく)
  • Git管理しているのだったら、バックアップのコミットハッシュを記録しておく。
  • リモートの現状ファイルのバックアップ(これもtarとかしておく)
  • ローカルとリモート間のdiffをログとかでとっておく。
  • rsyncで同期。
#!/usr/bin/bash

# backup local
git log | head -n 1 > ~/user/tmp/gitlog_hash.txt
tar -pczf ~/user/backup/rsync_tmp_backup.tar.gz ~/user/www ~/user/lib ~/user/tmp

# backup remote
ssh user@210.138.157.50 -i ~/user/.ssh/sshkey.pem "tar -pczf ./backup/rsync_tmp_backup.tar.gz ~/user/www ~/user/lib ~/user/tmp";

# diff logging
rsync --checksum -nav --delete --exclude-from=ignore_list -e "ssh -i ~/user/.ssh/sshkey.pem" ~/user/ user@210.138.157.50:~/user >> ~/logs/rsync.log;

# rsync
rsync -avz --delete --exclude-from=ignore_list -e "ssh -i ~/user/.ssh/sshkey.pem" ~/user/ user@210.138.157.50:~/user;

結果としてバックアップファイル同士のdiffはログに残っているものと一致することになります。
サーバーの容量が許せば数世代のバックアップを管理しておくというのがよいです。

Last update: 2016.08.18 (木)