2014年10月5日日曜日

gitolite3 で、hook スクリプトを設定する

git リポジトリで、hook スクリプトを設定したくなったので、調べてみたら、gitolite3 の設定で、同様のことが出来るようだ。
しかも、リポジトリ毎のスクリプト実行設定はもちろん、スクリプト自体も、gitolite 管理用リポジトリ(gitolite-admin)に、ファイルを追加すると、サーバーサイドで実行してくれるようだ。
仕組みは、管理用リポジトリの push を行った時点で、対象リポジトリの hooks に、設定したシェルのリンクを作成するようだ。gitolite 3.5.3.1-2 時点では、同一フック種に複数のシェルを指定することはできない。3.6 以降では、複数のシェルを設定できるようだが、未確認。

前提条件

  • gitolite3 や git は、インストールおよび設定済みとする。
  • gitolite3 の基本的な設定や利用方法は、習得済みとする。
  • gitolite3 ユーザーのホームディレクトリは、/var/lib/gitolite3 とする。
  • gitolite3 のリポジトリは、gitolite3 ユーザーのホームディレクトリに設定してあるものとする。

update フックの設定

1.gitolite3 のサーバー上の設定ファイルを変更する。

sudo vi /var/lib/gitolite3/.gitolite.rc
以下の行を、コメントインする。
# LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",
LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",

これで、gitolite 管理用リポジトリに登録した hook スクリプトが、利用可能になる。

2.gitolite 管理用リポジトリ(gitolite-admin)に update フックファイルを登録

以下のファイルを作成。LF 改行にすること。
gitolite-admin/local/VREF/hello

ファイルの内容は、以下のようにする。
#!/bin/bash
echo "Hello update"

hello ファイルを git add する
ファイルのパーミッションを設定する。ここ重要。
git update-index --chmod=+x hello

TortoiseGit の場合は、hello ファイルを右クリック⇒プロパティ
Git タブを選択⇒実行可能(+x) チェックボックスをチェックで、上記のコマンド入力と同等の状態となる。

コミットおよびサーバーへプッシュする。

3.各リポジトリに update フック設定を行う。

以下のファイルを修正し、最後の行を追加する。
gitolite-admin/conf/gitolite.conf

@admin = admin shpad
repo public/program/HelloClosureLibrary
    RW+     =   @admin
    R       =   @all
    -   VREF/hello = @all

コミットおよびサーバーへプッシュする。

4.動作確認

前述の設定を行ったリポジトリに対して、コミットを行ってみる。

git.exe push -v --progress  "origin" master:master

Pushing to ssh://gitolite3@yebisu/public/program/HelloClosureLibrary
Counting objects: 9, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 378 bytes | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Hello update
remote: From /var/lib/gitolite3/repositories/public/program/HelloClosureLibrary
remote:    7a5bd94..2af6ecd  master     -> origin/master
remote: Updating 7a5bd94..2af6ecd
remote: Fast-forward
remote:  js/src/common.js | 4 ++++
remote:  1 file changed, 4 insertions(+)
To ssh://gitolite3@yebisu/public/program/HelloClosureLibrary
7a5bd94..2af6ecd  master -> master
updating local tracking ref 'refs/remotes/origin/master'

成功 (2839 ms @ 2014/10/05 16:20:12)


うまく動いているようだ。
サーバー側のスクリプトの実行結果は、remote: の行に出力されている。
エラー時もここに表示される。便利。

その他フック設定

1.gitolite3 のサーバー上の設定ファイルを変更する。

sudo vi /var/lib/gitolite3/.gitolite.rc
以下の行を、コメントインする。
# LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",
LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",

# 'repo-specific-hooks',
'repo-specific-hooks',

2.gitolite 管理用リポジトリ(gitolite-admin)にその他フックファイルを登録

以下のファイルを作成。LF 改行にすること。
gitolite-admin/local/hooks/repo-specific/hello

ファイルの内容は、以下のようにする。
#!/bin/bash
echo "Hello post-receive"

hello ファイルを git add する
ファイルのパーミッションを設定する。ここ重要。
git update-index --chmod=+x hello

TortoiseGit の場合は、hello ファイルを右クリック⇒プロパティ
Git タブを選択⇒実行可能(+x) チェックボックスをチェックで、上記のコマンド入力と同等の状態となる。

コミットおよびサーバーへプッシュする。

3.各リポジトリにその他フック設定を行う。

以下のファイルを修正し、最後の行を追加する。
フックの動作タイミング = 前述のフックスクリプト。
gitolite-admin/conf/gitolite.conf

@admin = admin shpad
repo public/program/HelloClosureLibrary
    RW+     =   @admin
    R       =   @all
    -   VREF/hello = @all
    option hook.post-receive = hello


コミットおよびサーバーへプッシュする。

4.動作確認

前述の設定を行ったリポジトリに対して、コミットを行ってみる。

git.exe push --progress  "origin" master:master

Counting objects: 9, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 375 bytes | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Hello update
remote: Hello post-receive
To ssh://gitolite3@yebisu/public/program/HelloClosureLibrary
79615f9..a209006  master -> master

成功 (2433 ms @ 2014/10/05 17:13:39)