2007/08/04

あーてすてす

システムをいろいろといじったので更新のテストです。

って、それだけでおわりだとちょっと寂しいのでここ数日のメンテの話でも。

特に深い意味はなかったものの、いちいち更新するのにFFFTPを起動してFTPでファイルをPutするのがかなーり面倒だったので、この更新プロセスをどうにかできないものか! ということで挑戦。

とりあえず計画としては、サイトの構成ファイルをルートからぜーんぶSubversionのレポジトリにつっこんで、オレがローカルで更新した内容をsvnにチェックインしたらXREAにあるファイルが勝手に更新されるようなギミックを作ればいいとおもってました。

さて、そんなわけでXREAでsvn使おうと思ったら、前いたs87サーバって古いからsvnコマンド入ってませんでした…。ということで! 一昨日の! 移転劇! というわけでした。最新のs298サーバに移転したからもう大丈夫。

サーバにsvnがない問題さえ解決すればあとはpublic_html以下に自宅サーバからチェックアウトすればOKです。さっそく作業してsvnではパーミッションが保存されないのでそれを変えてあげて無事CGIがうごくようになりました。これで作業は8割完了。

ここまではいいんだけど、このままではローカルでチェックインしてもそれがXREAのほうにはupdateされないわけでして、ここからもう一工夫。XREA側にsvn updateを実行するCGIを用意して、それをSubversionレポジトリのpost-commitスクリプトから実行するように仕向けます。やり方は簡単で、レポジトリの下にあるhookディレクトリにwget http://beatsync.net/(svn updateするCGI) -O-とか書いたシェルスクリプトを置きました。

サーバ側のsvn更新CGIとして最初はperlで書いたんですよ。こんなかんじ。

#!/usr/bin/perl

print "Content-Type: text/plain; charset=EUC-JP\n\n";
system("/usr/bin/svn update ../");

よくわかってない人には「へぇーこんなこともできるんだあー」ですが、よく分かってる人からみれば「それわざわざperl使う意味NEEEEEEE」って感じです。オレもそれは気がついたよ…。おとなしくシェルスクリプトで書けばいいじゃん。perlで書いた方がmod_perlで動くからキャッシュが効くよ! とか言われそうだけど、どうせそんな頻繁に動かすCGIじゃないですから。

#!/bin/sh

echo Content-Type: text/plain; charset=EUC-JP
echo 
/usr/bin/svn update ../

と書き換えておきました…。あとはXREAのサーバ側でコメントがあったときにこっちのレポジトリにコメント内容をチェックインするようにコメント書き込みCGIを書き換えなきゃ…。

というわけで、このsvnのpost-commit連携によるWeb更新の一発目のテストでしたー。

今回この仕組みを構築してておもったんだけど、これって複数サーバ間のミラーリングしたWebサイト運営にはなかなかいい手法ですよね。たとえば3つぐらいミラーリングしてるWebサイトがあったとして、post-commitでその3つのサイトのsvn updateするCGIを叩くようにしておけばローカルでチェックインかけただけで3つのサイトが一気に更新されるわけです。

これならいちいち複数サーバにPutする手間もいらないし、なおかつcronでミラーリングとかみたいなスケジュール実行じゃなくて「コミット時」というイベント発生のタイミングでミラーリングをかけるので無駄なミラーリング実行をすることなく、リアルタイムのミラーリングを最小限の負荷でやってのけるという。

まぁその場合の課題はほぼ同時に複数のミラーサイトからコメントとかがあったときにsvnがコリジョン起こす可能性があるってやつですが、それは運用でなんとかするしかないのかなーと。ちなみにsvnにはlockする機能もありますから、svn lockを利用してコミットルーチンを組んでやればこの辺のリスクも限りなく抑えられそうです。みたいな素人考えでした。

うされもん @acidlemonについて

|'-')/ acidlemonです。鎌倉市在住で、鎌倉で働く普通のITエンジニアです。

30年弱住んだ北海道を離れ、鎌倉でまったりぽわぽわしています。

外部サイト情報

  • twitter
  • github
  • facebook
  • instagram
  • work on kayac