Gitlab5.0の構築

今回は、Gitlabの5.0を構築します。

これまで、gitoliteで管理・gitwebで閲覧していましたが、管理が面倒になったので何か別のフロントエンドを導入することを検討していました。

Gitlabはgitoliteの管理機構を利用するらしいという情報を掴み、スムーズに移行できるのではとGitlabに的を絞りました。
導入手順を調べていると、どうやらGitlab5.0からはgitoliteは使用せず、
gitlab-shellという独自のGit管理ツールを使うように変更されたということが発覚。

2分くらい悩んだ結果、gitoliteの導入歴が浅かったこともあり、gitoliteを捨てGitlabに完全移行することを決意しました。

### 構築環境
・Ubuntu 12.04 Server
・Gitlab 5.1
・nginx 1.2.7

・Redmineとの同居
・Rub1.9.3-p392 をgitユーザに個別インストールして構築
・Gitプロトコルを通さないProxyに閉ざされた環境

・URLは`http://192.168.169.170:8001`とする

## 導入手順
基本は公式の手順に従って行う。
大変丁寧に書かれているので、迷うことは無く進めることが出来る。
[gitlabhq - installation.md](https://github.com/gitlabhq/gitlabhq/blob/5-0-stable/doc/install/installation.md)

### 準備
まずは必要なパッケージを用意。
手順の示すがまま入れていく。
vimmerではないので代わりにnanoを使用。

```
$ apt-get update
$ apt-get upgrade

$ apt-get install sudo
$ apt-get install nano
$ apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl git-core openssh-server redis-server postfix checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev
```

```
$ apt-get install python
$ python --version
$ # 上記コマンドで2.*が出ない場合は、python2.7指定でinstall
$ apt-get install python2.7

$ python2 --version
# 上記コマンドが見つからない場合は、リンクを貼る
$ sudo ln -s /usr/bin/python /usr/bin/python2
```

### gitユーザ作成
Gitlabを管理するユーザを作成。
公式手順と前後するが、Rubyをgitユーザ個別にインストールするので順番を逆に。

```
$ sudo adduser --disabled-login --gecos 'GitLab' git
```

### Rubyのインストール
今回は、RedmineのRubyとは分けて管理する。

以下で、gitユーザ専用のRubyをインストールする。
Redmine構築の際にお世話になった[くじらにっき++](http://kujira16.hateblo.jp/entry/2012/09/04/144953)さんの手順で構築。

```
# rbenvインストール
$ cd /home/git
$ git clone git://github.com/sstephenson/rbenv.git .rbenv

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> /home/git/.profile
$ echo 'eval "$(rbenv init -)"' >> /home/git/.profile

# ruby-buildインストール
$ mkdir src
$ cd src
$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ sudo ./install.sh

# Rubyとbundleインストール
$ rbenv install 1.9.3-p194
$ gem install bundle
$ rbenv rehash
$ gem i rbenv-rehash
```

### Gitlab-Shellインストール
これが、Gitlab5.0になってgitoliteの代わりに利用されるGitlab専用のGit管理ツール。
ユーザ管理やアクセス管理を受け持つツールのよう。

```
# gitユーザとして操作
$ sudo su git

# クローン & 適切なバージョンの選択
$ cd /home/git
$ git clone https://github.com/gitlabhq/gitlab-shell.git

$ cd gitlab-shell
$ git checkout v1.1.0
$ git checkout -b v1.1.0
```

設定ファイルの編集。
ひな形があるのでそれをそのまま利用する。

```
$ cp config.yml.example config.yml
```

手順通りに進めていれば、`gitlab_url`以外編集する必要は無いと思われる。
`gitlab_url`にGitlabに使用する予定のurlを設定。

```config.yml
gitlab_url : "http://192.168.169.170:8001"
```
これで準備完了。インストールを行う。

```
$ ./bin/install
$ exit
```

### DB構築
今回はMySQLを使用。
公式の手順は[別ページ](https://github.com/gitlabhq/gitlabhq/blob/5-0-stable/doc/install/databases.md)にある。

```
$ sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev

$ mysql -u root -p

# ユーザ追加
mysql> CREATE USER 'gitlab'@'localhost' IDENTIFIED BY '*****';

# データベース作成
mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;

# 全操作権限を'gitlab'@'localhost'に提供
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost';

mysql> \q

# 試しにgitユーザで接続出来るかテスト
sudo -u git -H mysql -u gitlab -p -D gitlabhq_production
```

### Gitlabのインストール
いよいよ、Gitlab本体をインストール。
先程作成したgitユーザのhome以下に構築する。

```
$ cd /home/git
```

最新ソースを取得

```
$ sudo -u git -H git clone https://github.com/gitlabhq/gitlabhq.git gitlab
$ cd /home/git/gitlab

# stable版を選択
$ sudo -u git -H git checkout 5-0-stable
```

次に、gitlabのサイト設定とDB設定を行なっていく。
(gitlab.ymlをunicorn.rbが読み込んで起動するものと思われる。)

```
$ sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml
$ sudo -u git cp config/database.yml.mysql config/database.yml
```

```Ruby:config/gitlab.yml
production: &base
  gitlab:
    host: 192.168.169.170
    port: 80
...
    # 以下をコメントアウト
    user: git

```

```Ruby:config/database.yml
production:
  username: gitlab
  password: "******"
```

次は、Gitlab実行時にアクセスするファイルのアクセス権限を変更。

```
# gitユーザによるlog以下とtmp以下の操作を許可
$ sudo chown -R git log/
$ sudo chown -R git tmp/
$ sudo chmod -R u+rwX  log/
$ sudo chmod -R u+rwX  tmp/

# unicornのpid保持フォルダを用意し、アクセス許可
$ sudo -u git -H mkdir tmp/pids/
$ sudo chmod -R u+rwX  tmp/pids/
```

その他、諸設定。

```
# 謎のフォルダ作成。
$ sudo -u git -H mkdir /home/git/gitlab-satellites
```

### Gemのインストール
ここからが鬼門だった。
Ruby初心者でありLinux初心者である自分にとっては鼻血が出る訳の分からなさだった。

```
$ sudo su - git

$ cd /home/git/gitlab
$ gem install charlock_holmes --version '0.6.9'

$ bundle install --deployment --without development test postgres
```

`bundle install`を実行すると、`git://github.com/gollum/gollum.git`の部分でエラーが出る。
エラーを見ると、どうやらgitプロトコルをプロキシが通さないのが原因。
`git`でアクセスしている場所を`https`に変更しなくてはいけない。

今回は、`gollum`を取ってくる部分でgitプロトコルを使用しているので、`/home/git/gitlab`以下のgemfileとgemfile.lockの該当箇所を以下のように修正する必要がある。
参考 : [Issue #3416](https://github.com/gitlabhq/gitlabhq/issues/3416)

```Ruby:gemfile
gem "gollum", "~> 2.4.0", git: "https://github.com/gollum/gollum.git", ref: "5dcd3c8c8f"
```

```Ruby:gemfile.lock
  remote: https://github.com/gollum/gollum.git
```

今一度、bundle install

```
$ bundle install --deployment --without development test postgres
$ exit
```

エラー無く完了。
これでようやく必要なものが揃ったので、Gitlabのセットアップを行う。

```
$ bundle exec rake gitlab:setup RAILS_ENV=production
```

### Gitlabのサービス登録
Gitlab起動のサービス化を行うため、unicornの起動スクリプトを`/etc/init.d`以下に置き、サービス登録を行う。

```
$ sudo curl --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlab-recipes/5-0-stable/init.d/gitlab
$ sudo chmod +x /etc/init.d/gitlab

$ sysv-rc-conf gitlab on
```

再起動してみる。が、起動すると思ったが起動しない。
ソースを見ると、`gitlab`ファイルの中でbundlerしているのが原因。
パスを通すために以下を追加。

```Ruby:/etc/init.d/gitlab
export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/home/git/.rbenv/bin:/home/git/.rbenv/shims
```

再起動し、エラー無く動いていればOK。

### 設定状況の確認
gitlabの構築環境をチェック。
自分の思い通りの設定になっているか確認する。

```
$ sudo su - git
$ bundle exec rake gitlab:env:info RAILS_ENV=production
```

次にgitlabの環境が正常に構築されているかどうかをチェックする。

```
$ bundle exec rake gitlab:env:info RAILS_ENV=production
$ exit
```

エラーが出たら、言われたとおりに直しましょう。

これで、Gitlabの設定は完了。
次は、nginxの設定。

### nginxの設定

入っていなければインストール

```
$ sudo apt-get install nginx
```

サイト設定のひな形があるので取ってくる。

```
$ sudo curl --output /etc/nginx/sites-available/gitlab https://raw.github.com/gitlabhq/gitlab-recipes/5-0-stable/nginx/gitlab
$ sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab
```

自分の環境にあわせて以下のように設定修正。

```/etc/nginx/sites-available/gitlab
...
  listen 8001;
  server_name _;
...
```

サイト設定が完了したら、nginxを再起動。

```
$ sudo service nginx restart
```

予定していた`http://192.168.169.170:8001`に接続してGitlabが表示すれば完了。


### 運用時の問題点
そう簡単には終わらなかった。

インストールも完了。
ユーザを作成。
鍵を登録。
testリポジトリをcloneしたが、、、上手く取れなかった。

調べてみると、原因はsshで接続するときに実行されるcommandがrubyを欲しているからと判明。
`/home/git/.ssh`以下のauthorized_keysを見ると、

```/home/git/.ssh/authorized_keys
command="/home/git/gitlab-shell/bin/gitlab-shell key-0",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==aa-bb-cc
```

`/home/git/gitlab-shell/bin/gitlab-shell` の中でrubyコマンドを使用しているらしい。
その為、gitlab-shellの頭を以下に変更する。

```/home/git/gitlab-shell/bin/gitlab-shell
#!/home/git/.rbenv/shims/ruby
```

これで、ssh認証が通り、`git clone`が出来るようになる。
これにて一件落着。

余りに引っかかり過ぎ、色々と試行錯誤していたため、書き足りていない手順があるかもしれない。
暇ができたらもう一度初めから構築してみて、足りない手順やもっとスマートな解決方法があったら追加・修正していこうと思います。