gerritのhooksスクリプトを使ってみる

gerritのサーバ側のhooksスクリプトの使い方をまとめました。gerritを使い始める前はgitリポジトリの.git/hooks/post-updateでJenkinsのテストを実行していました(JenkinsのGerrit Trigger Pluginで実行するテストとは別の内容のテストです)。gerritでも同様のことを実現します。

gerritのインストール方法はこちらを参照してください。

 

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のテストを実行することができました。