1

プレコミットで perl スクリプトを呼び出していcommit_log.plます。スクリプトは非常に多くの事前チェックを行っています。今、コミットの承認後にメールを送信しようとしています。権限の問題により、ポストコミット フックを設定できません。そのため、コミット前のスクリプト自体でメール送信を呼び出そうとしています。

私のcommit_log.pl場合、終了コードがゼロの場合でも機能しprintfていません。

終了コードが 1 の場合、すべて正常に動作しています

pre-commit:

log=`$SVNLOOK log -t "$TXN" "$REPOS"`
author=`$SVNLOOK author -t "$TXN" "$REPOS"`
CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS"`

/usr/bin/perl /isource/svnroot/fgw_ins/hooks/user/commit_log.pl "$log" "$author" "$CHANGED" "$0" 1>&2

if [ "$?" -eq "1" ];
then
        exit 1
else
        exit 0
fi

# if does not match..fail...
exit 1
---------------------------------------------------------------------------------
commit_log.pl
------------------------


}
   else
                {
                        print("Commit approved\n");#this printf itself is not working
                        `python $path/send_mail.py $comment $committed_filepath`;
                        exit 0;
                }
4

2 に答える 2

1

Aviの答えにこれ以上追加することはできません.STDOUTはフックに飲み込まれます. STDOUTが表示されることはありません。STDERR は、フック スクリプトがゼロ以外の終了コードを返した場合にのみクライアントに表示されます。これは通常、フックが失敗したことを意味し、プレコミット フックではコミットが妨げられます。

コミット後にメールを送信する必要があり、コミット後のフックを使用できない場合は、Jenkinsのような継続的なビルド システムを使用することをお勧めします。Jenkins にリポジトリを監視させ、新しいリビジョンが見つかったら、関係者に電子メールを送信できます。

Jenkins は、コミットのたびにビルドを実行できる継続的なビルド システムですが、ビルドを実行する必要がある理由はありません (ただし、通常はそれが良い考えであることを除けば)。Jenkins はcommit 後に任意のアクションを実行するように設定できるため、Jenkins に関係者にメールを送信するだけで済みます。

はい、電子メールを送信するためだけに Jenkins のようなシステム全体を使用するのは少しやり過ぎです。単純に独自のスクリプトを作成してみませんか? ただし、Jenkins のダウンロード、インストール、構成は 1 時間か 2 時間で完了します。実行する必要があると思われるものをレイアウトするだけでも時間がかかります。

さらに、Jenkins を使用すると、他にもさまざまな用途を見つけることができます。

于 2011-05-17T12:14:44.837 に答える
0

pre-commit フックからの標準出力がどこに送信されるかわかりません。SVN bookによると、標準エラーはクライアントに送り返されますが、エラーが発生した場合 (つまり、ゼロ以外の終了コードで終了した場合) に限られます。

標準出力ではなく、特定の場所に書き込もうとします (例: テスト用の /tmp/pre-commit.log)。

また、一般的に、コミットが成功したことを前提とする pre-commit スクリプトでの作業は、できる限り避けるべきです。コミット自体の間など、プレコミット スクリプトの実行後もコミットが失敗する可能性があるため、ポストコミット スクリプトが存在します。

于 2011-05-17T07:49:59.337 に答える