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に一行追加
post-commitがちゃんと動いているのかは
sudo -u svndesu /var/aaa/svn/hoge/hooks/post-commit
って確認してみるといいです。それに気づかずに途中まで延々testって書いてコミットしていたよ。
これでなんとかうまくいきました。最初はpost-commitの中でsudoとか使おうとしてvisudoに色々書いたりしましたが結局やめました。簡単が一番。