gitolite3とgitwebの導入@Ubuntu

[`gitolite3`](http://gitolite.com/gitolite/index.html)と[`GitWeb`](https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-GitWeb)を使用して，プライベートなレポジトリを構築する方法を紹介します．`gitolite3`を使用することで，`git-daemon`を使用するよりもはるかに簡単にアクセス制限を実施することが可能です．
特徴は下記のとおりです．なお，想定環境はUbuntu 16.04 LTS Xenial Xerusです．

* `git clone git@github.com:kyokuheki/***.git`みたいな形で`clone`できます．githubと同じ形式です．
* `22/tcp`と`http/80`を使用し，`git-daemon`で使用される`9418/tcp`は使用しません．
* アクセス制限は，テキストベースで記述できます．
* アクセス制限のコンフィグファイルは`git`で管理されます．
* ユーザは公開鍵によって管理されます．
* `gitolite3`だけの導入であれば，`Apache`は使用しません．

# gitolite3のインストール
## 管理者用の鍵の作成
gitolite3の管理者となるユーザがgitolite用の鍵を作成し，作成した鍵の公開鍵をサーバの作業ユーザのディレクトリにコピーしておく．
下記は管理者端末から実施する．

```console:gitolite3
$ ssh-keygen
$ ssh-copy-id ubuntu@<gitサーバ> 
$ ssh ubuntu@<gitサーバ>
$ ssh ubuntu@<gitサーバ> "ls .ssh"
authorized_keys
$ ssh ubuntu@<gitサーバ> "cat .ssh/authorized_keys"
ecdsa-sha2-nistp521 *****************************== <####>@<####>
```

## パッケージのインストール
次に，gitサーバにログインして下記コマンドを実行．
インストール時にgitolite3の管理者の公開鍵を聞かれるので，`/home/<user>/.ssh/authorized_keys`と入力する．gitolite3ユーザが作成される．

```console
$ sudo apt install git gitolite3
$ sudo grep gitolite3 /etc/passwd
gitolite3:x:104:112:git repository hosting,,,:/var/lib/gitolite3:/bin/bash
$ sudo ls -a /var/lib/gitolite3
.   .bash_history  .gitolite     .ssh  projects.list
..  .cache         .gitolite.rc  logs  repositories
```

##`.gitolite.rc`に設定を追加
下記の操作でgitoliteからgitwebのdescriptionを設定できるようになる．

```sh
sudo vim /var/lib/gitolite3/.gitolite.rc
```

```/var/lib/gitolite3/.gitolite.rc
    GIT_CONFIG_KEYS                 =>  'gitweb\.(owner|description|category)',
```


## アクセス権・レポジトリの設定・追加
管理者端末から下記コマンドを実行して，管理者端末にgitolite管理用のデータをクローンする．

```sh
git clone gitolite3@<gitサーバ>:gitolite-admin.git
```

###ユーザの追加
公開鍵を追加すれば，ユーザが追加される．ユーザ名は公開鍵のファイル名．

```sh
cp ~/.ssh/id_rsa.pub ./gitolite-admin/keydir/<username>.pub
```

###レポジトリのアクセス権の設定
`conf/gitolite.conf`に`repo`を追加して`push`すると，レポジトリが追加される．

```sh
vim ./gitolite-admin/conf/gitolite.conf
git commit -m "edit config"
git push
```

```./gitolite-admin/conf/gitolite.conf
@developers = admin user1 user2 user3
@admin      = admin user1

repo gitolite-admin
    RW+     =   admin @admin
    R       =   @developers

repo testing
    RW+     =   @developers
    R       =   gitweb @all

repo sandbox
    desc    =   "git sandbox"
    RW+     =   @developers
    R       =   gitweb @all

repo soft-patch-panel
    R       =   gitweb @all
```

## 動作確認
```console
$ ssh gitolite3@<gitサーバ> info
hello admin, this is gitolite3@gitserver running gitolite3 3.6.4-1 (Debian) on git 2.7.4

 R W    gitolite-admin
 R W    sandbox
 R W    testing
$ ssh gitolite3@<gitサーバ> help
hello okuda, this is gitolite3@gitserver running gitolite3 3.6.4-1 (Debian) on git 2.7.4

list of remote commands available:

        desc
        help
        info
        perms
        writable
```

## 参考
* http://d.hatena.ne.jp/Dltn/20121114/1352905191
* http://qiita.com/mountcedar/items/9d87d793a493295e08f0
* https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-Gitolite
* http://gitolite.com/gitolite/http.html

# gitweb
gitサーバ上で下記コマンドを実行する．

```
sudo apt install gitweb libcgi-pm-perl
sudo a2enconf gitweb
sudo a2enmod cgid
sudo service apache2 restart
```

以上で完了．

## Ubuntu 14.04の場合
ちなみにUbuntu 14.04の場合はもう少し作業が必要．gitwebによって追加されるApache2の設定ファイルはパスや内容が間違っているので修正する．

```
sudo apt install gitweb
sudo mv /etc/apache2/conf.d/gitweb /etc/apache2/sites-available/gitweb.conf
sudo vim /etc/apache2/sites-available/gitweb.conf
```

```apache:/etc/apache2/sites-available/gitweb.conf
Alias /gitweb /usr/share/gitweb

<Directory /usr/share/gitweb>
  Options +FollowSymLinks +ExecCGI
  AddHandler cgi-script .cgi
</Directory>
```

gitwebを有効化して，apache2を再起動する．

```
sudo a2enmod cgid
sudo a2ensite gitweb.conf
sudo service apache2 restart
```

# gitolite3とgitwebの連携
次にgitolite3にgitwebからアクセスできるように設定を追加する．gitwebはapache2のプロセス配下で動作するので，ユーザidは`www-data`となる．`www-data`が属するグループからアクセスできるようにしておけば問題なく動作する．

## UMASKの設定
gitolite3によるファイル操作時のUMASKを設定し，グループのパーミッションが追加されるようにする．

```sh
sudo vim /var/lib/gitolite3/.gitolite.rc
```

```/var/lib/gitolite3/.gitolite.rc
    UMASK                           =>  0027,
```

## 既存ファイルのアクセス権を修正

```
sudo gpasswd -a www-data gitolite3
sudo chmod g+rx /var/lib/gitolite3
sudo chmod g+r /var/lib/gitolite3/projects.list
sudo chmod -R g+r /var/lib/gitolite3/repositories
sudo find /var/lib/gitolite3/repositories -type d -exec chmod g+x {} +
```

## gitweb.confの修正
gitwebの設定を修正し，gitolite3を参照するように変更する．

```
vim /etc/gitweb.conf
```

```pl:/etc/gitweb.conf
# cat /etc/gitweb.conf
# path to git projects (<project>.git)
$projectroot = "/var/lib/gitolite3/repositories";

# directory to use for temp files
$git_temp = "/tmp";

# target of the home link on top of all pages
#$home_link = $my_uri || "/";

# html text to include at home page
#$home_text = "indextext.html";

# file with project list; by default, simply scan the projectroot dir.
$projects_list = "/var/lib/gitolite3/projects.list";
$strict_export = "true";

# stylesheet to use
@stylesheets = ("static/gitweb.css");

# javascript code for gitweb
$javascript = "static/gitweb.js";

# logo to use
$logo = "static/git-logo.png";

# the 'favicon'
$favicon = "static/git-favicon.png";

# git-diff-tree(1) options to use for generated patches
#@diff_opts = ("-M");
@diff_opts = ();
```

## 参考
* http://troglobit.github.io/blog/2015/06/30/howto-apache-with-gitweb-on-debian-8-dot-1/
* http://gitolite.com/gitolite/gitweb-daemon.html
* https://www.hellion.org.uk/blog/posts/gitolite-and-gitweb-vhost-setup/

# リモートレポジトリのミラー
githubにある公開レポジトリをリモートレポジトリにミラーしていつでもアクセスできるようにする．

```sh
sudo su gitolite3
cd ~/repositories
git clone --mirror https://github.com/garogers01/soft-patch-panel.git
cd soft-patch-panel.git
git fetch --all
exit
sudo service apache2 restart
```

# Smart HTTPでHTTPでCloneできるようにする
apache2が既に入っている環境であれば，ちょっとの設定追記でSmart HTTPを有効化できます．

```sh
vim /etc/apache2/sites-available/git.conf
a2ensite git.conf
apache2ctl configtest
service apache2 restart
```

```aconf:/etc/apache2/sites-available/git.conf
SetEnv GIT_PROJECT_ROOT /var/lib/gitolite3/repositories
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git /usr/lib/git-core/git-http-backend
        
<Location /git>
        Options +ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch
        AuthType Basic
        AuthName "Smart HTTP Git Access"
        AuthUserFile "/var/www/trac/.htpasswd"
        Require valid-user
        Order allow,deny
        Allow from all
</Location>

ErrorLog ${APACHE_LOG_DIR}/error_git.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#LogLevel debug
        
CustomLog ${APACHE_LOG_DIR}/access_git.log combined
```

# 参考
* http://gitolite.com/gitolite/install.html
* http://sharadchhetri.com/2013/05/31/how-to-create-own-git-server-with-gitolite-and-gitweb-in-ubuntu/
* http://absolutearea.blogspot.jp/2014_08_01_archive.html
* https://www.atlassian.com/ja/git/tutorial/git-basics#!init
* http://shim0mura.hatenadiary.jp/entry/20120914/1347591103