gerritのサーバ側のhooksスクリプトの使い方をまとめました。gerritを使い始める前はgitリポジトリの.git/hooks/post-updateでJenkinsのテストを実行していました(JenkinsのGerrit Trigger Pluginで実行するテストとは別の内容のテストです)。gerritでも同様のことを実現します。
gerritのインストール方法はこちらを参照してください。
Table of Contents
1 クライアント側
gitと同様に.git/hooks/配下に設置します。gerritは"Change-Id: xxx"のコミットメッセージが必要なので、それを自動追加するcommit-msgスクリプトがgerritサーバ側から配布されます。
2 サーバ側
gitとは異なります。
- gerrit.confでパスを指定する必要がある。
- hooksスクリプトの名前が異なる。
- プロジェクト単位で設定することができない。
/var/gerrit/git/<project>.git/hooksのhooksスクリプトは使われないようです。
2.1 gerrit.confの設定
hooksセクションでpathを指定します。
diff -uprN /var/gerrit/etc/gerrit.config{.org,}
--- /var/gerrit/etc/gerrit.config.org 2015-08-24 22:53:57.906370083 +0900
+++ /var/gerrit/etc/gerrit.config 2015-08-24 21:07:14.874120742 +0900
@@ -19,3 +19,5 @@
[container]
user = gerrit
javaHome = /usr/lib/jvm/java-7-openjdk-amd64/jre
+[hooks]
+ path = /var/gerrit/hooks
gerritを再起動します。
/etc/init.d/gerrit restart
2.2 hooksスクリプト
gerritのページに各hooksスクリプトの説明が記載されています。今回はchange-mergedスクリプトを使用します。chagne-mergedスクリプトはgerritでsubmitボタンを押して変更がリポジトリに反映された場合に呼ばれます。
change-merged --change <change id> --change-url <change url> --change-owner <change owner> --project <project name> --branch <branch> --topic <topic> --submitter <submitter> --commit <sha1> --newrev <sha1>
上記のchange-mergedの場合、–project等のオプションが渡されます。
2.3 プロジェクト単位で実行
hooksスクリプトに渡される引数でプロジェクトを判別することができます。<project name>はgerritのプロジェクト名です。
change-merged ... --project <project name> ...
そこでchange-mergedスクリプトでプロジェクト名を判別して各プロジェクト用のchange-merged_<project name>スクリプトを呼ぶようにします。
$ ls -l /var/gerrit/hooks/change-merged
-rwxr-xr-x 1 gerrit gerrit 316 8月 24 21:29 /var/gerrit/hooks/change-merged
$ cat /var/gerrit/hooks/change-merged
#!/bin/sh
prefix=$0
eval set -- `getopt -q -o p: --long project: -- "$@"`
while true; do
if [ $# -eq 0 ]; then
break
fi
case "$1" in
--project)
project=$2
shift 2
;;
*)
shift
;;
esac
done
script=${prefix}_${project}
if [ -f ${script} ]; then
exec ${script}
fi
/var/gerrit/git/<project name>.git/hooks配下のchange-mergedを呼ぶようにしても良いかもしれません。
/var/gerrit/hooks/change-mergedに加えて、/var/gerrit/hooks/change-merged_<project name>を追加することで、Submitボタンを押した延長でJenkinsのテストを実行することができました。