絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

gitoliteとgitweb on nginx を連携させたメモ

備忘録メモ。
Debian wheezy 上で gitoliteを構築してgitwebと連携させたんだけど、そのさいにnginx の FastCGIを使った。
勢いでやったので色々アレなので後学のために改善点あったら突っ込んでください。なおします。

gitoliteのinstallと設定

% sudo apt-get install gitolite
% sudo dpkg-reconfigure gitolite

これで、reconfigure中に適当な公開鍵を指定してやれば、gitoliteの設定は完了。
その鍵を使って

% git clone gitolite@localhsot:gitolite-admin

とかでgitolite-adminリポジトリをとってこれるので、適宜権限とか変更してpush。
gitoliteの設定とかはググればいっぱい出る。
あとは特にいじる必要なし。

gitwebのinstallと設定

% sudo apt-get install gitweb
% sudo vi /etc/getweb.conf
---------
$projectroot = "/var/cache/git";
---------
$projectroot = "/var/lib/gitolite/repositories"
---------

こんな感じに書き換える。

nginxの設定とFastCGIまわり

まずはnginx。gitweb用の設定を足す。

% sudo apt-get install nginx libfcgi-perl libfcgi-procmanager-perl
% sudov vi /etc/nginx/site-available/gitweb
-------------
server {
    root /usr/share/gitweb;
    index index.cgi;

    server_name git.example.com;

    location ~ \.cgi$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.cgi;
        include fastcgi_params;
    }
}
-------------
% ln -s /etc/nginx/site-available/gitweb /etc/nginx/site-enable

libfcgi-procmanager-perlが本当に必要かどうかは見てない。勢いで入れた。

ただ、このまんま呼び出そうとしてもうまくいかなかったりして、
gitwebのプロセスを建てておく必要がある。

% cd /var/lib/gitolite
% vi gitweb.fcgi
% sudo chown gitolite:gitolite gitweb.fcgi
% sudo chmod +x gitweb.fcgi

gitweb.fcgiは、ここから拝借してきた。http://blog.chavant.info/2009/05/30/gitosis-gitweb-nginx
たぶんこっちのgistも同じ物。https://gist.github.com/985059

こいつを常駐起動しておけばリクエスト受け付けられる。

% sudo -u gitolite /var/lib/gitolite/gitweb.fcgi --fcgi-socket=127.0.0.1:9000 --cgi-bin=/usr/share/gitweb/gitweb.cgi &!

これで基本的にはOK.

変なエラーとか原因とか対策とか。

たぶん、↑のgitweb.fcgi をそのまま使うと、

[Sun Jun 26 14:20:37 2011] gitweb.fcgi: Subroutine git_snapshot redefined at /usr/share/gitweb/gitweb.cgi line 6119.

という感じのnotice が、2アクセス目からerror.logに山盛り出る。


原因は、深く追ってないけどおそらく、gitweb.cgi を常駐プロセスにしているせい。
初回は大丈夫なんだけど、2アクセス目以降には既に各モジュールがロード済になっているので、サブルーチンが既に定義済ですよってことで怒られるんじゃないかって想像してる。


根本的には、CGIとしてなんかやり方が間違ってるんだと思う。
けど、直すのも大変めんどくさいし別に害はなさそうなので、今回はスルー。

うざいって場合は /usr/share/gitweb/gitweb.cgi

no warnings 'redefine';

って握りつぶしちゃ*1とか、↑で作ったgitweb.fcgiで31行目あたりを

\*STDERR -> \*STDOUT

とかしちゃってそのままttyと共にあの世にいってもらうとか/dev/null行きとかで十分じゃないですかね。

本気で使うときはちゃんとやって下さい。今回僕は遊びなんでこれで。


ざっとこんな感じで、gitoliteとgitwebをdebian/nginx環境上で使えます。

*1:gitweb.cgiだけ握りつぶしても、他のところのは出るので気になる人は気になるかも。