てきとう

ワーワーゆうとります

post-commitと戦ったよー

やりたい事と前提

  • プロジェクトは「hoge」
  • SVNのユーザーは「svndesu」
  • SVNでコミットされたらpost-commitでワーキングコピーをhoge内にupdateする
  • コピーをwebroot/hoge以下にいらないファイル以外をrsyncする

post-commitの中身

if [ -e /var/aaa/svn/hoge/rsync_copy ];
then
  /usr/bin/svn up /var/aaa/svn/hoge/rsync_copy/* >> /var/log/svn/rsync.log
else
  mkdir /var/aaa/svn/hoge/rsync_copy
  /usr/bin/svn checkout file://localhost/var/aaa/svn/hoge/trunk/* /var/svn/aaa/hoge/rsync_copy >> /var/log/svn/rsync.log
fi

/var/aaa/svn/hoge/rsync_copyというディレクトリがあったらsvn upで、なかったらmkdirしてワーキングコピー置き場を作ってからのcheck out
上で書いてないですが、mkdirした後にchownとかでsvndesuさんが操れるようにしてあげておくと幸せ。柿の木が京都まで50本あったら今日は幸せ。
一応ログもとってみる。


そしてそのままrsyncしてwebroot以下に置くと.svnなどいらないファイルがついてくるのでそいつをスルーするため色々書く。
別に.shのファイルを作るまとめて書けばいいじゃん。そうだねその通りだね。でも作る。

hoge_rsync.shの中身

#!/bin/sh
SVN_DIR=/var/aaa/svn/hoge/rsync_copy/
FROM_DIR=$SVN_DIR
TO_DIR=/var/webroot/hoge/

## svn update
cd $SVN_DIR
/usr/bin/svn update
cd -

/usr/bin/rsync \
        --dry-run \
        --delete \
        --checksum \
        --archive \
        --recursive \
        --verbose \
        --exclude '.svn' \
        $FROM_DIR \
        $TO_DIR

answer=$1

if [ $answer = "-y" ];
then
    answer="y"
else
    echo -n "rsync ok? [y/n]"
    read answer
fi

if [ $answer = "y" ];
then

/usr/bin/rsync \
        -av \
        --delete \
        --checksum \
        --archive \
        --recursive \
        --verbose \
        --exclude '.svn' \
        $FROM_DIR \
        $TO_DIR

fi                 

そしてこいつを動かすために、post-commitに一行追加

/bin/sh /var/aaa/svn/hoge/hoge_rsync.sh -y /dev/null 2>&1

post-commitがちゃんと動いているのかは

sudo -u svndesu /var/aaa/svn/hoge/hooks/post-commit

って確認してみるといいです。それに気づかずに途中まで延々testって書いてコミットしていたよ。
これでなんとかうまくいきました。最初はpost-commitの中でsudoとか使おうとしてvisudoに色々書いたりしましたが結局やめました。簡単が一番。