SVNでローカルサイトの自動更新

パソコン・インターネット

Mac OS X 10.5.8 Leopardで、Subversion(SVN)によるWebサイト(ホームページ)の管理システムを構築しました。何回かに分けて、紹介しています。

さて、いよいよ本システムの勘所、リポジトリ更新(コミット:commit)後のローカルサイト(ホームページ)の自動更新です。

Mac OS Xでの、ローカルホームページの設定方法は、次回に紹介します。

SVNには、hook(フック)と言う仕掛けがあって、SVNコマンドの動作時に別コマンドを動かす事が出来ます。今回は、リポジトリ更新後のフック(post-commit)を使います。

リポジトリのtrunkが更新されたら、ローカルホームページを更新する様にします。設定方法は次の通りです。

  1. ローカルホームページ用のディレクトリ作成
  2. ローカルホームページ用のディレクトリに作業コピーをsvn checkout
  3. ローカルホームページ用のディレクトリのオーナ、グループ設定
  4. フックスクリプト作成
  5. フックスクリプトのオーナ、グループ、実行権設定
  6. ログディレクトリの作成
  7. コミット実験

(1)まず、ローカルホームページ用のディレクトリを作ります。私の環境では、/Usersを別ディスク(パーティション)としているため、この中にローカルホームページ用ディレクトリ(/Users/Htdocs)を作る事にしました。実際には、更にその下の/Users/Htdocs/homepage1をローカルホームページにしています。

$ cd /Users
$ sudo mkdir Htdocs

(2)次に、ローカルホームページ用のディレクトリへ、作業コピーをチェックアウトします。

$ cd /Users/Htdocs
$ sudo svn checkout file:///Users/Svn/repos/wwwlocal/trunk homepage1

httpによるURL指定ではなく、 fileを使う所が肝です。 httpからのアクセスだと、パスワードが設定されているので、自動更新でエラーになります。多分、解決方法があるのでしょうけど、調べていません。

(3)ここまで出来たら、ユーザ、グループを適切に変更します。Mac OS Xの場合、www(_www)と言うユーザとグループが用意されています。

$ cd /Users
$ sudo chown -R www:www Htdocs

作業コピーの準備が完了しました。

(4)その次に、フックスクリプト/Users/Svn/repos/wwwlocal/hooks/post-commitを作ります。

$ cd /Users/Svn/repos/wwwlocal/hooks
$ sudo cp post-commit.tmpl post-commit
$ sudo vi post-commit

viエディタ(他のエディタでも構いません)を使って、post-commitファイルを編集します。

元の内容は、次の様になっていると思います。

REPOS="$1"
REV="$2"
commit-email.pl "$REPOS" "$REV" commit-watchers@example.org
log-commit.py --repository "$REPOS" --revision "$REV"

これを、次の様に変更します。

REPOS="$1"
REV="$2"
WC="/Users/Htdocs/homepage1"
LOG="/Users/Svn/logs/wwwlocal-post-commit.log"
echo "-----" `/bin/date '+%F %T %Z'` "--------------------" >> $LOG
/usr/bin/svn update $WC >> $LOG 2>&1
echo "User:" `/usr/bin/id` >> $LOG

(5)フックスクリプトの実行権、オーナ、グループを正しく設定します。

$ sudo chmod 774 post-commit
$ sudo chown www:www post-commit

(6)そして、ログファイル用のディレクトリを準備しておきます。忘れない様にして下さい。

$ cd /Users/Svn
$ sudo mkdir logs
$ sudo chown www:www logs

(7)正しく設定されたかどうか、実験します。上記の設定の後、レポジトリのtrunkに対してファイルを追加してから、コミットします。

$ cd
$ cd Sites.svn
$ touch testfile
$ svn add testfile
$ svn commit testfile -m "テストファイル追加"
Adding         testfile
Transmitting file data .
Committed revision 25.

ログファイル(/Users/Svn/logs/wwwlocal-post-commit.log)を確認して下さい。正しく、 svn updateされているでしょうか? lsで、ファイルも見ておきます。

$ tail /Users/Svn/logs/wwwlocal-post-commit.log
----- 2010-02-28 01:19:15 JST --------------------
A    /Users/Htdocs/homepage1/testfile
Updated to revision 25.
User: uid=70(_www) gid=70(_www) groups=70(_www)
$ ls /Users/Htdocs/homepage1
image1.jpg	newpage1.html	newpage3.html	subdir1		testfile
index.html	newpage2.html	styles.css	subdir2

うまくいかない時は、ファイル、ディレクトリの実行権、オーナなどを確認して下さい。

先ほど作ったファイルを、削除しておきます。

$ cd
$ cd Sites.svn
$ svn remove testfile
$ svn commit -m "テストファイル削除"
Deleting       testfile
Committed revision 26.

ログファイルも更新されているはずです。

$ tail /Users/Svn/logs/wwwlocal-post-commit.log
----- 2010-02-28 01:19:15 JST --------------------
A    /Users/Htdocs/homepage1/testfile
Updated to revision 25.
User: uid=70(_www) gid=70(_www) groups=70(_www)
----- 2010-02-28 01:20:57 JST --------------------
D    /Users/Htdocs/homepage1/testfile
Updated to revision 26.
User: uid=70(_www) gid=70(_www) groups=70(_www)
$ ls /Users/Htdocs/homepage1
image1.jpg	newpage1.html	newpage3.html	subdir1
index.html	newpage2.html	styles.css	subdir2

【引っ掛かった事】

ローカルホームページ用データをチェックアウトする方法に、てこずりました。file://を使って回避しました。

post-commitで、svn updateしています。本来の意味からすると、svn exportする方が正しいのじゃないのか? と思いましたが、これは時間がかかり過ぎます。必要なファイルの操作だけしてくれる、svn updateの方が良いです。

ファイルやディレクトリのオーナ設定は、正しく(wwwに)設定して下さい。

【参考にしたWebページ】

以下のページを参考にさせていただきました。ありがとうございます。

猫ITソリューションズ |  ウェブ制作におけるSubversionによるバージョン管理(2) – インストール・設定 –
猫とLinuxがイノベーションを加速する
私の記事の基本になっています。
ばーぶろぐ /var/blog: Subversionでコミット完了後に自動で処理を行う (post-commit)
猫ITソリューションズさんの参照先になっています。
Subversionのフック・スクリプト (コミット関連) – snbhsmt_log
フックスクリプトを参考にさせていただきました。

【シリーズ記事】

SVNによるWebサイト(ホームページ)管理

  1. SVNリポジトリの作成
  2. SVNリポジトリをhttp(WebDAV)でアクセス出来るようにする
    SVNリポジトリをhttp(WebDAV)でアクセス出来るようにする(おまけ)
    SVNリポジトリをhttp(WebDAV)でアクセス出来るようにする(Digest認証化)
  3. SVNリポジトリの中にサイトデータを作る
  4. サイトデータの作業コピーでの作業(ターミナル編)
    サイトデータの作業コピーでの作業(Emacsのpsvn編)
  5. SVNでローカルサイトの自動更新
  6. ローカルサイトをアクセス出来るようにする
  7. ローカルサイトからインターネットへ

Posted by お市のかた