Thursday, May 31, 2012

gitolite を gitweb + apache で公開

gitolite を gitweb + apache CGI で公開させる場合の手順です。

今回紹介する方法では apache 実行ユーザに全ての gitolite リポジトリの参照権限を与えます。gitolite でアクセス制限している意味がなくならないように導入にあたっては十分に注意してください。WebサーバにCGIやPHPスクリプトを設置できるユーザは、apache ユーザ経由ですべてのリポジトリファイルを取得できることになります。

CentOS6.2から、以下のパッケージを yum インストールした想定で説明します。

gitolite

バージョン
gitolite.noarch 2.3-2.el6 @epel
ユーザ:グループ
gitolite:gitolite
ホームディレクトリ
/var/lib/gitolite

gitweb

バージョン
gitweb.noarch 1.7.1-2.el6_0.1 @base
DocumentRoot
/var/www/git
GITWEB_SYSTEM_CONFIG
/etc/gitweb.conf

gitolite のリポジトリに作成されるファイルは gitolite ユーザでの読み書きのみになっています。gitolite グループが参照できるように、.gitolite.rc を編集します。

$ su -
$ su - gitolite
$ vi ~/.gitolite.rc

$REPO_UMASK 値で、リポジトリファイル作成時の umask を 0077 => 0027 に変更します。以降作成されるファイルに gitolite グループに参照権限が付与されます。

#$REPO_UMASK = 0077;
$REPO_UMASK = 0027;

gitolite のホームディレクトリと作成済みのリポジトリに対して gitolite グループへ読み込み許可を与えます。

$ su -
$ chmod 750 /var/lib/gitolite
$ find /var/lib/gitolite/repositories -type d -exec chmod 750 {} \;
$ find /var/lib/gitolite/repositories -type f -exec chmod 640 {} \;

apache の実行ユーザを gitolite グループに加えます。これで apache 実行ユーザから /var/lib/gitolite/repositories を参照できるようになりました。

$ su -
$ usermod -G gitolite apache

/var/lib/gitolite/repositories を丸ごと公開してしまうと、gitolite-admin.git 含め全てのリポジトリが見えてしまいます。別にディレクトリを作成して公開可能なリポジトリのみシンボリックリンクを貼るとよいです。

# $projectroot として /var/lib/gitolite/repos-pub を作成
$ su -
$ su - gitolite
$ mkdir ~/repos-pub
# 公開するリポジトリだけをシンボリックリンク
$ cd ~/repos-pub
$ ln -s ../repositories/foo.git
$ ln -s ../repositories/bar.git

gitweb が参照する $projectroot を /var/lib/gitolite/repos-pub に変更します。/etc/gitweb.conf を書き換えてもよいのですが、gitweb.cgi と同じディレクトリに設置した gitweb_config.perl で設定することもできます。

$ cp /etc/gitweb.conf /var/www/git/gitweb_config.perl
$ vi /var/www/git/gitweb_config.perl

環境変数 GITWEB_CONFIG でファイル指定することもできます。

SetEnv /path/to/another/gitweb.conf

設定ファイルの $projectroot の値を変更します。

#our $projectroot = "/var/lib/git";
our $projectroot = "/var/lib/gitolite/repos-pub";

後は apache から gitweb.cgi にアクセスできるようにします。yum パッケージからインストールした場合、/etc/httpd/conf.d/git.conf が出来ていますので、必要に応じて修正します。以下は git.example.net で公開する例です。

<VirtualHost *:80>
    ServerName git.example.net
    DocumentRoot /var/www/git
    <Directory /var/www/git>
        Options ExecCGI FollowSymlinks
        AllowOverride all
        AddHandler cgi-script .cgi
        DirectoryIndex gitweb.cgi
    </Directory>
</VirtualHost>

今回の例では一つの gitweb のみですが、/var/www/git をコピーし $projectroot を変更すれば、複数の gitweb を立ち上げることができます。