どぶお/開発しよう!

GitLab 5.1.0をRVM環境で構築する -- Vine 6.1  

2013-05-14 : 作成

概要  

以前からGitLab 2.1.0を使っていましたが、久しぶりに最新版にしようとしたらいつの間にか5.1.0まで進んでいました。HTTP(S)によるアクセスにも標準で対応しているので、これだけでSSHおよびHTTP(S)が使えるようになっているみたいです。

公式サイトのインストールドキュメントによると、過去とは手順も全く違うようだったので、まっさらな状態からインストールしてみたので記録しておきます。2.1.0と比べるとgitoliteのインストールが不要になったり、Apacheと使う場合にpassengerを使わずにリバースプロキシを使うようになったなどの変更が見受けられました。手順はだいぶスッキリしましたが、相変わらず敷居は高いと思います。Linuxによるサーバ管理の基礎知識ぐらいは必要かもしれません。

大まかな流れは以下のようになります。

  1. 前提条件の準備
    1. aptによる必要なプログラムのインストール
    2. Vine 6で不足しているredisパッケージのインストール(作成)
    3. Gitのバージョンアップ(1.7.12.4)
  2. GitLabと依存プログラムのインストール
    1. GitLab実行ユーザー(git)の作成
    2. RVM環境の構築(Ruby 1.9.3のインストール)
    3. GitLab Shellのインストール
    4. データベースの作成(PostgreSQL)
    5. GitLabのインストールとセットアップ
    6. 初期化スクリプトの設定

なお、使用環境はVine Linux 6.1で、RVM(Ruby Version Manager)環境を用いて構築します。設定が少し増えますがVirtualHostを使うことでGitLab 2.1との共存も可能です。

前提条件の準備  

ビルドに必要なライブラリなどをインストールします。ほとんどはaptでインストール可能ですが、redis-serverおよびgitは別途インストールが必要です。

aptによる必要なプログラムのインストール  

自動解決されるためインストールする順番は特にありませんが、これらをすべてインストールします。

# apt-get install build-essential zlib-devel libyaml-devel openssl-devel gdbm-devel \
readline-devel ncurses-devel libffi-devel sqlite3-devel libxml2-devel libxslt-devel
# apt-get install libicu-devel
# apt-get install postgresql-server postgresql-devel

libicu-develはRubyモジュールのcharlock_holmesのインストールに必要です。

RedisおよびGitのインストール  

セッション管理などに使用されるRedisサーバはVineの標準リポジトリに収録されていないので手動でインストールします。また、Vine6のGitは1.7.4ですが、GitLabに使うには古いので最新版である1.8.2.3にアップグレードします(1.7系の最新版である1.7.12.4でも動作しましたが、日常的なコマンドとして使用する際にgit clone https://〜で通信できなかったので、1.8のほうが良さそうです)。

以下のページからダウンロードしてインストールします。

# apt-get install perl-Git-1.7.12.4-1vl6.x86_64.rpm git-1.7.12.4-1vl6.x86_64.rpm
# apt-get install redis-2.4.6-1vl6.x86_64.rpm

Pythonの別名シンボリックリンクをはる  

/usr/bin/pythonに対してpython2という名前のシンボリックリンクを作成します。これはファイル内容を表示する際に使用されるため、リンクしないとInternal server errorが出ます。

# cd /usr/bin
# ln -s python python2

GitLabのインストール  

実行ユーザーの作成  

GitLabを実行するユーザーgitを作成します。ホームディレクトリは/home/gitにします。公式ドキュメントではnologin設定で作るように書いてありますが、初期設定を行いやすくするためログイン可能とします。

# groupadd -g 600 git                         <-- GID:600で作成
# useradd -m -g 600 -u 600 git                <-- UID:600で作成
# passwd git                                  <-- シェルで作業するのでパスワードを設定しておく
# su - git                                    <-- ユーザーgitで作業
% git config --global user.name "GitLab"
% git config --global user.email "git@localhost"

user.nameとuser.emailを設定しておかないとGitLabでの動作の時にエラーが発生します。
以降、インストールはユーザーgitで行います。

RVM環境の構築  

GitLabはRuby 1.9.2以降が必要なので、異なるバージョンのRubyを使用するためのRVM環境を構築します。この環境で使用することでRubyのモジュール等をシステムにインストールすることなく、ホームディレクトリだけで完結させることができます。この作業はユーザーgitで行います。

cURLでファイルを取得する際に証明書のエラーが出るので、insecureを.curlrcに書き込んでから作業を行います。作業が終わったらinsecureを解除してください。なお、Ruby 1.9のインストールはビルドが行われるため10分ほど時間がかかります。

$ cd /home/git
$ echo insecure >> ~/.curlrc
$ \curl -L https://get.rvm.io | bash -s stable
$ rvm install 1.9          <-- 1.9系の最新が入る(2013年5月14日の時点では1.9.3p392)
$ rvm use 1.9              <-- インストールした1.9系を選択
$ gem install bundler
$ gem install charlock_holmes --version '0.6.9.4'

GitLab Shellのインストール  

GitLab ShellはGitLab用のSSHアクセスおよびリポジトリ管理用プログラムだそうです。

$ cd /home/git
$ git clone https://github.com/gitlabhq/gitlab-shell.git
$ cd gitlab-shell
$ git checkout v1.3.0
$ cp config.yml.example config.yml

設定ファイルconfig.ymlをエディタで開いてgitlab_urlの値を修正します。

# Url to gitlab instance. Used for api calls. Should be ends with slash.
gitlab_url: "http://gitlab.example.co.jp/"     <-- 適切なURLにします

修正後インストールします。

$ ./bin/install

この時、リポジトリ用の/home/git/repositoriesディレクトリが作成されます。

データベースの作成  

GitLabで使用するデータベースを作成します。ここではPostgreSQLを使いましたが、MySQLも使えます(公式ドキュメント参照)。

# service postgresql start
$ psql -U postgres
psql> CREATE USER git WITH PASSWORD '$password';
psql> CREATE DATABASE gitlabhq_production OWNER git;
psql> \q

ここの$passwordは使用するパスワードを指定してください。GitLab設定の際に必要になるので忘れないようにしてください。以下のコマンドで開けるかどうかを確認してください。抜けるときは\qです。

$ psql -d gitlabhq_production

GitLabのインストール  

GitLabを取得し、必要な手順を行います。これもすべてユーザーgitで行います。

$ cd /home/git
$ git clone https://github.com/gitlabhq/gitlabhq.git gitlab
$ cd gitlab
$ git checkout 5-1-stable      <-- 5.1.0をチェックアウトします
$ cp config/gitlab.yml.example config/gitlab.yml

config/gitlab.ymlの編集

$ mkdir /home/git/gitlab-satellites
$ mkdir tmp/pids
$ mkdir tmp/sockets
$ mkdir public/uploads
$ cp config/puma.rb.example config/puma.rb
$ cp config/database.yml.postgresql config/database.yml
$ bundle install --deployment --without development test mysql
config/puma.rbの修正
Apacheで使うために、pumaのバインド先をlocalhostのTCPポートにします。
 61: bind 'tcp://127.0.0.1:9292'                                   <-- localのみ
 62: #bind "unix://#{application_path}/tmp/sockets/gitlab.socket"  <-- コメントアウト
config/database.ymlの修正
ユーザー名とパスワードを適切に指定します。

GitLabのセットアップと初期化スクリプト  

GitLabのデータベースの初期化
この段階でRedisを起動します。
# service redis start
$ cd /home/git/gitlab
$ bundle exec rake gitlab:setup RAILS_ENV=production
ユーザーgitの設定
初期化スクリプトでのsudoおよびSSHでのpushに対応するために.bashrcにRVMの設定を書き込みます。インストール時に自動でPATHの設定は追加されますがsource設定が書き込まれないので末尾に追加します。
PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting  <-- 自動で追加されている
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" <-- 追加
初期化スクリプトの設定
初期化スクリプトをインストールします。この作業はrootで行います。
# curl --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlabhq/master/lib/support/init.d/gitlab
# chmod +x /etc/init.d/gitlab
chkconfigで登録できるように/etc/init.d/gitlabの内容を修正します。
 3: # GITLAB
 4: # Maintainer: @randx
 5: # App Version: 5.1
 6: # chkconfig: 2345 21 80                         <-- 追加
 7: # description: GitLab git repository management <-- 追加
chkconfigに登録します。
# chkconfig --add gitlab

Apacheの設定  

Apacheの詳細な設定については述べません。最低限の設定は以下になります。

/etc/apache2/conf.d/gitlab.conf
ProxyPass / http://127.0.0.1:9292/
ProxyPassReverse / http://127.0.0.1:9292/
ProxyPreserveHost On
このように設定すればhttp://gitlab.example.co.jp/という感じでGitLabにアクセスできるはずです。
なお、HTTPSを使う場合は、VirtualHostの中に以下の行を追加します。
RequestHeader set X-Forwarded-Proto "https"
このパラメータがないとページ遷移の際にHTTPに飛ばされてしまうことがあります。

chkconfigの設定  

必要に応じて設定します。

# chkconfig postgresql on
# chkconfig redis on
# chkconfig gitlab on
# chkconfig apache2 on

お疲れ様でした。これで(たぶん)使えるはずです!
問題はRVM周りで起こりやすいので、エラーが発生した場合はRVMの内容を調べてみてください。

トラブルシューティング  

とりあえず気づいたことをメモしておきます。

SSHでpushできない  

問題
SSH経由でpushするときに以下のエラーが出ました。
[dobuo@localhost exam]$ git push git@192.168.0.201:dobuo/exam.git
Enter passphrase for key '/home/dobuo/.ssh/id_rsa':
/home/git/gitlab-shell/bin/gitlab-shell:8: undefined method `require_relative' for main:Object (NoMethodError)
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
原因
これはRubyのバージョンが1.9.2以上になっていないことが原因で、RVMを使って構築した時に起こるようです。私の環境では標準のRuby(aptでインストールされるRuby)は1.8のためエラーが出るようです。なお、標準のRubyをインストールしていない場合はうまくいくため、パスの順序を変えれば解決できるようです。
解法
ユーザーgitの設定のように修正します。別の方法としてPATHの設定を以下のようにしても解決しました。
PATH=$HOME/.rvm/bin:$PATH    <-- 標準パスよりも$HOME/.rvm/binを先にする
状況に合わせて対応してください。

ファイル内容が表示されない  

問題
ファイル内容を表示させた時何も表示されない。production.logを見ると以下のメッセージが出力されている。
Started GET "/dobuo/chocolat-wiki/blob/master/code/myrpc.js?_=1368612329078" for 192.168.155.109 at 2013-05-15 19:05:32 +0900
Processing by BlobController#show as JS   <-- この行がポイント
  Parameters: {"_"=>"1368612329078", "project_id"=>"dobuo/myrpc", "id"=>"master/code/myrpc.js"}
  Rendered blob/_actions.html.haml (36.1ms)
  Rendered blob/_text.html.haml (292.4ms)
  Rendered blob/_blob.html.haml (339.9ms)
  Rendered blob/show.js.haml (343.3ms)
Completed 500 Internal Server Error in 488ms

ActionView::Template::Error (EPIPE):
    9:   .file_content.code
    10:     - unless blob.empty?
    11:       %div{class: user_color_scheme_class}
    12:         = raw blob.colorize(formatter: :gitlab)
    13:     - else
    14:       %p.nothing_here_message Empty file
  app/views/blob/_text.html.haml:12:in `_app_views_blob__text_html_haml___691087839_78158170'
  app/views/blob/_blob.html.haml:23:in `_app_views_blob__blob_html_haml___344748651_79771910'
  app/views/blob/show.js.haml:3:in `_app_views_blob_show_js_haml__1016274567_81034620'
原因
コードのシンタックスハイライトをPythonで処理しているようで、そのため/usr/bin/python2が存在しないとレンダリングされないようです。赤字の部分のように#show as 書式が判断のポイントかも。そのためshow as HTMLなどの場合もあるようです。
解法
/usr/bin/pythonに/usr/bin/python2という名前でリンクを張ります。上記参照。

コメントなどありましたらどうぞ。