【 駄文 】


■□■ Works


お仕事関係話。基本的にLAPP(Linux,Apache,PostgreSQL,PHP)、LAMPでqmailでvpopmailでproftpdでOpenLDAPといったカンジ。 半ば本人用の備忘録です。

■ SubversionによるPHP開発環境バージョン管理話 2006.10.03

 これまでPHPでいくつかシステム開発を行ってきたワケですが、お恥ずかしい話ながら複数開発者がいるような 環境でもこれまで特に「バージョン管理」ってのを行ってきませんでした。

 や、まあヒトの手による記述程度のバージョン管理は行ってきましたが、あくまで当事者達の主観によるものであり それらが共有される事はあまりなく、つまりはバージョンの意味合いが曖昧になりがちでした。
 また、同じファイルを数人でいじる事もあったため、「声かけ」という初歩的な回避策しかとれない環境では バックアップのタイミングやら戻しやらでのデグレも何度か発生し、且つソレの原因がどこにあるか判別付かない パターンが何度かありました。

 なんとかしたいなあ、と思いつつも具体的な手法となると色々環境による制約がついてしまってイマイチ導入に 踏み切れない。世の中的には「バージョン管理」というと「CVS」がほぼ代名詞になってるっぽいなあ、 などと色々調べてるウチに、ひっかかったのが標題の「Subversion」。CVSを踏襲しつつ弱点を補う事を目的として 作られたモノっぽい。色々情報見てるとよさげだが、一貫した情報が欲しかったので書籍を購入し、 翌日には稼働開始させました。インストールやら初期導入やらは他に詳しいサイトさんが多いので割愛します。

 さて、とりあえず導入したのは例によってLinuxのPHP+Smarty環境。ヒトが作ったシステムの改修なのですが どーもあまりPHPもSmartyも知らないヒトが作ったっぽく、テンプレートフォルダを堂々とDocumentRoot下に置く なんだかなぁ設計。
 まあおかげでリポジトリは作りやすかったですが。とりあえずDocumentRoot下を丸々インポート。 と同時にこのシステム、管理者用に仮想フォルダが一個あるんでそちらも別にインポート。

 さて今回は開発環境はWindows端末を想定。今までならLinux上でvi使いやがれ、と言うのが基本方針なんですが(笑)、 そうすると一般開発者のバージョン管理にSubversionのコマンド操作を強要する事になる。 中にはPHPのコーディングも微妙なヒトがいたりするので(苦笑)余計な負担は極力減らした方がいい、と判断。 Windowsで簡単にSubversionをコントロールできる「TortoiseSVN」を導入しました。

 そのTortiseSVNとの通信を行うために、Subversion付属の簡易サーバ「svnserve」を稼働。 そもそものリポジトリ構成を
一般用:  /repos/normal
管理用:  /repos/admin
とした際に、svnserveの起動オプションを
svnserve --daemon --root /repos
と指定。こうすることでTortoise側でアクセスする際に
一般用:  svn://[サーバ]/normal
管理用:  svn://[サーバ]/admin
と分けて個別にアクセスすることができるようになります。

 さて、PHPは当たり前ですがWebアプリケーション。特定のDocumentRoot下、要するに今回の場合インポート元フォルダの 内容が更新されないと修正の結果がWeb上に表れません。
 なのでDocumentRootもリポジトリからデータをチェックアウト→更新の流れにする必要があるわけですが、 各個別の開発者が自分に関係するファイルをコミットする度にサーバ側で「svn update」をするのはメドい。 各自のコミットが成功したら、DocumentRootは自動更新されるのが望ましいわけです。
 それを実現するのがいわゆるフックファイル。各リポジトリディレクトリの「hooks」ディレクトリに置かれ、 コミットの前後など特定のタイミングで稼働するシェルファイルです。
 今回の場合、コミット後に稼働する「post-commit」に「/usr/bin/svn update [DocumentRoot]」みたいに 記述することで、クライアントのコミットと同時に自動更新される環境が構築できます。



 なんてな(笑)。

 いや上記の方法で自動更新一応できるはできるんだけど、状況?環境?によって出来ない場合もあるっぽい。 「post-commit」そのものはちゃんと動作するのだが、「svn update〜」がちゃんと動かない環境がある。
 今回の場合、具体的には「一般」のDocumentRootは問題なく更新されるのだが、「管理」のDocumentRootの 更新が行われない。
 試しに1つのpost-commitに一般、管理双方を更新するコマンドを記述し、且つその結果をリダイレクトで ファイルに書き出してみたんだけど、更新される一般側はその結果がファイルに残るのだが、更新されない管理側は なーんにも表示されない。フォルダが間違ってるとかのエラー系も出ない。
 ところがpost-commitを直接コマンド叩くとどちらの更新も成功するのでワケわからん。シェル内に「whoami」書いて 権限調べたりもしたのだが、コミット連動、コマンド直叩きどちらも当然のよーに「root」で動作してる。 もーわけわからんナリよキテレツ!

 で、コレの対処をどうしたかというと、「svn update /DocumentRoot/*」と言う風に、 本来フォルダ指定だけでいけるところをわざわざワイルドカードで中身全指定したら 一応は更新されるようになった。処理結果の吐き出し具合を見ると少し微妙ではあるのだが、 サブフォルダに変更加えてソレをコミットしてもちゃんと更新されるので、とりあえず実用的には 問題ないと判断してます。

 ただこの状況がどーゆー理由で発生してるかがよく分からないので、今大丈夫な方もいずれダメになる可能性を 否定できないのが怖い。とりあえずは様子見しながら使ってみます。

 ま、更新だけの話なんで、マスターであるリポジトリに影響するような致命的な問題じゃないんでいいんだけどね。

追記:
 Windows側(TortoiseSVN側)でファイルを追加→コミットした場合に、post-commitでのupdateで新規ファイルが 出力されない状況も発生中。サーバにログインして「svn update」するとあっさり表れる。
 つまるところSubversion純正のコマンド群はイマイチpost-commit(というかフックファイル)と相性悪いって事だろか。それともバージョン次第か。




↑ 戻る


.
Thanks to 372650 visits.
 □ 上位アクセスアイテム