2

CentOSサーバーでSVNのコミット後スクリプトを実行しようとしています。リポジトリにコミットするたびに、var / svn/projectから/var/ www/projectにsvnexport--forceを実行したいと思います。私は多くの選択肢を試しましたが、それを機能させることができませんでした。誰かがユーザー権限の問題なしで実行されるスクリプトを投稿できれば幸いです。

/ var / svn / project /hooksの下にあるコミット後のファイルの例:

#!/bin/sh
sudo /usr/bin/svn export --force svn://domain/var/svn/project /var/www/project

rootユーザーがSSHから直接スクリプトを実行した場合は機能しますが、実際のSVNがコミットした後は機能しません。

4

1 に答える 1

2

sudo失敗しているような気がします。

あなたがやりたいことは悪い考えなので、実際には問題ではありません。そのリポジトリのエクスポートはどのくらいの大きさですか?どのくらい時間がかかりますか。20秒?2分?

あなたがSubversionユーザーであり、変更をチェックインしようとしていると想像してください。コミットすると、突然端末がフリーズしたように見えます。たぶん20秒間、たぶん2分間。コミット後のフックが完了するのに必要なものは何でも。少年、あなたは自分自身に思います、Subversionはとても遅いです...

これを行うためのより良い方法は、crontabを使用することです。そして、rootとして物事を行う能力があれば、確かにcrontabを行うことができます。

最後のSubversionリビジョンを追跡します。次に、変更を検出した場合は、エクスポートを実行します。シンプルなスクリプトで、実装が簡単で、エクスポートを待っている間にSubversionがフリーズすることはありません。

ちなみに、Subversionサーバープロセスを実行しているユーザーは何ですか。それがフックを実行するユーザーです。パスワードを必要としないようにファイルにそのユーザーが/etc/sudoers設定されていない場合、コミット後のフックは失敗します。また、Subversionフックにはパスがないため、sudoコマンドを見つけることができません。コマンドの前に、コマンドが含まれているディレクトリを付ける必要があります。

それでも、それを機能させたとしても、それはまだ悪い考えです。

これがあなたが望むことをするcrontabを作成する試みです。完全にテストされていません。今夜は時間がないだけです。しかし、それはあなたにアイデアを与えるでしょう:

#! /bin/bash
REPO_URL="http://...."
DIR=...   #Where you want the export
LAST_REV_FILE=/var/run/svn.last.rev
SVN=/usr/bin/svn
SED=/usr/bin/sed
current_rev=$($SVN info $REPO_URL | $SED -n '/^Revision: /s/^Revision: //p')
if [ ! -f $LAST_REV_FILE ]
then
     echo $current_rev > $LAST_REV_FILE
     exit 0
fi

#You're here if there is a last.rev.file
last_rev=$(echo $LAST_REV_FILE)
[ $last_rev -ge $current_rev ] && exit 0

# New Revision
echo $current_rev > $LAST_REV_FILE
rm -rf $DIR
$SVN export $REPO_URL $DIR
于 2012-10-16T01:11:05.950 に答える