プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Amazon Linux AMIにGit + Gitolite + Gitlabをインストールして、プライベートGitHubを構築する

 半年くらい下書きフォルダーにあったGitLabのインストール記事をサルベージしました。今回は、Amazon Linux AMIと最新のGitLab 4.1系でインストールしています。が、あまりに長く面倒くさいので、三行でまとめてみました。

  • GitLabはGitHubのクローンで、セキュリティー・ポリシー的にGitHubがNGな会社に最適
  • GitLabの中身は、Git + GitoliteをラッパーしたWebインターフェース
  • インストールが死ぬほど面倒くさいので、後でAWSのPublic AMIとして公開するよしたよ

GitLabのPublic AMIを公開しました。


以下、手順です。気が長い人は読んでください。

ライブラリのインストール



 素のAmazon Linux AMIを立ち上げたら、まずライブラリをインストールしましょう。一部sudoでやっていくと詰まるところがあったので、素直にrootになってからインストールしています。

$ sudo su -
# yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel
# yum install -y make bzip2 openssl-devel
# yum install -y gettext libcurl-devel gdbm-devel mysql-server mysql-devel git python-devel libicu-devel postfix
# yum install -y python-pip redis --enablerepo=epel
# yum -y install httpd httpd-devel mod_ssl
# yum -y install perl-Time-HiRes

 Amazon Linux AMIは、デフォルトではExtra Packages for Enterprise Linux (EPEL)のアクセスがオフになっています。そのため、python-pipとredisは --enablerepo=epelをつけてインストールしましょう。

サービスの開始



 インストール終了後に、サービスを開始しましょう。特に特別なことはないです。

# chkconfig httpd on
# chkconfig redis on
# chkconfig mysqld on
# /etc/init.d/httpd start
# /etc/init.d/redis start
# /etc/init.d/mysqld start

rvmのインストール



 Amazon Linuxのrubyは、1.8系です。これを1.9系に変えると、awsのrubyツールが動かなくなるので、rvmで1.9系をいれることにします。

# \curl -L https://get.rvm.io | bash -s stable --ruby
# echo '[[ -s "/usr/local/rvm/scripts/rvm" ]] && . "/usr/local/rvm/scripts/rvm" # Load RVM function' >> /etc/bashrc
# source /etc/bashrc

ユーザの作成



 GitLabとGitolite用のユーザを作成します。Gitoliteがgitを、GitlLabがgitlabを使用します。また同じグループに属して、gitディレクトリへのグループアクセス権を付与します。

# useradd git
# useradd gitlab
# usermod -G git gitlab
# chmod g+rx /home/git

gitlabアカウント用の鍵ファイルを作成



 GitLabインストールの最大の難関である、gitlabユーザからgitへのsshでのログイン設定を行います。そもそも何故これが必要かというと、GitLabはgit及びgitoliteの薄いラッパーのWebインターフェースとして作られている為です。画面から操作を受け付けると、GitLabを動かしているgitlabユーザがssh経由で所定のコマンドを実行しています。この構造を理解していないと、GitLab動かねぇよとハマることになります。(ハマって初めて理解できました。)
 手順としては、gitlabアカウントで秘密鍵・公開鍵を作成します。その後、gitアカウントのauthorized_keysにgitlabの公開鍵を追加します。

# su - gitlab
$ ssh-keygen -t rsa -f ~/.ssh/gitadmin
(パスフレーズは空でO.K.です)
$ exit #rootに戻る
# cp /home/gitlab/.ssh/gitadmin.pub /home/git

Gitoliteのインストール



 ここまで設定が出来たらGitoliteのインストールです。Gitoliteは、gitユーザの管理をしてくれるアプリケーションです。GUIでのUIはいらないけど、gitのアカウント管理は面倒臭いという場合は、Git+Gitoliteでも充分重宝すると思います。

# su - git
$ git clone git://github.com/sitaramc/gitolite
$ gitolite/install
$ gitolite setup -pk /home/git/gitlab.pub"
$ vi /home/git/.gitolite.rc
#UMASKの値を0077から0007
$ exit

 ここでのポイントは、.gitolite.rcを編集してUMASKの値を0077から0007に変更することです。私もここでハマりました。


gitlabアカウントからgitへのログイン確認

# su - gitlab
$ ssh -i .ssh/gitadmin git@localhost
$ exit #ログイン出来る事を確認して、ログアウト
$ vi ~/.ssh/config
  Host localhost
  HostName localhost
  User git
  IdentityFile ~/.ssh/gitadmin
$ chmod 600 .ssh/config

Gitlabのインストール



 遂にGitLabのインストールです。GitLabのインストール自体は難しくないのですが、動かしてみて問題点を解決するというのが何度か繰り返すことになるでしょう。

# sudo su - gitlab
$ git clone https://github.com/gitlabhq/gitlabhq.git gitlab
$ cd gitlab/
$ git checkout 4-1-stable
$ chown -R gitlab log/
$ chown -R gitlab tmp/
$ chmod -R u+rwX  log/
$ chmod -R u+rwX  tmp/
$ cp config/database.yml.mysql config/database.yml
$ bundle install --deployment --without development test postgres
$ git config --global user.name "GitLab"
$ git config --global user.email "gitlab@localhost"
$ cp ./lib/hooks/post-receive /home/git/.gitolite/hooks/common/post-receive

# chown git:git /home/git/.gitolite/hooks/common/post-receive
$ bundle exec rake gitlab:setup RAILS_ENV=production
$ mysql
create database gitlabhq_production  CHARACTER SET utf8;

# bundle exec rake db:setup RAILS_ENV=production --trace
# bundle exec rake db:seed_fu RAILS_ENV=production


 このメッセージが出れば、成功です。

login.........admin@local.host
password......5iveL!fe
Updating repo permissions ...
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (7/7), done.
Receiving objects: 100% (10/10), 1.30 KiB, done.
Resolving deltas: 100% (1/1), done.
remote: Total 10 (delta 1), reused 0 (delta 0)
... done

Creating satellites for ...skipping, because you have no projects


rootで起動設定も行います。

# curl --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlab-recipes/4-1-stable/init.d/gitlab
# chmod +x /etc/init.d/gitlab
# chkconfig gitlab on
# /etc/init.d/gitlab start


gitlabユーザで、下記のコマンドでステータスチェックが行えます。

$ bundle exec rake gitlab:env:info RAILS_ENV=production
$ bundle exec rake gitlab:check RAILS_ENV=production

passengerのインストールとapacheとの連携



 passegerを使ってapacheと連携します。ポイントは、gitlabからgitへの接続の為、apacheをgitlabユーザで起動することです。

#gem install passenger --no-ri --no-rdoc
#gem install charlock_holmes --version '0.6.9'
#passenger-install-apache2-module

apacheの設定。インストール後のサンプルに従って、設定。/etc/httpd/conf.d/passenger.confを作成します。

LoadModule passenger_module /usr/local/rvm/gems/ruby-1.9.3-p385/gems/passenger-3.0.19/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/rvm/gems/ruby-1.9.3-p385/gems/passenger-3.0.19
PassengerRuby /usr/local/rvm/wrappers/ruby-1.9.3-p385/ruby

# ServerName www.yourhost.com
# !!! Be sure to point DocumentRoot to ‘public’!
DocumentRoot /home/gitlab/gitlab/public

# This relaxes Apache security settings.
AllowOverride all
# MultiViews must be turned off.
Options -MultiViews


apacheをgitlabユーザで動かします。(それが嫌なら、gitlabをapacheユーザで動かす必要があります。)

# vi /etc/httpd/conf/httpd.conf
#User apache
#Group apache
User gitlab
Group gitlab
# cd /var/log
# chown -R gitlab:gitlab httpd/
# /etc/init.d/httpd restart

トラブルシューティング



gitlabからgitへsshでログイン出来るものの、gitolite-adminがclone出来ない

git clone localhost:gitolite-admin
fatal: 'gitolite-admin' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
rake aborted!
unable to clone gitolite-admin repo

試してみると、こちらのコマンドではclone出来ます。

git clone git@localhost:~/repositories/gitolite-admin.git

素のsshでログインしていて、gitoliteのコマンドが通っていなかったことが解ります。.ssh/authorized_keysを


画面からリポジトリを作成すると、"git config 'core.sharedRepository' not allowed"のエラーが出る
 次のようなエラーがでたら、.gitolite.rcのGIT_CONFIG_KEYSを編集しましょう

February 11, 2013 14:22 -> ERROR -> Gitolite error -> remote: FATAL: git config 'core.sharedRepository' not allowed
remote: check GIT_CONFIG_KEYS in the rc file
To git@localhost:gitolite-admin
75dc4de..5f42c35 master -> master

 下記の方法で解決です。

vi /home/git/.gitolite.rc
GIT_CONFIG_KEYS             =>  '.*',

まとめ



 結論としては、GitLabのインストールはとんでもなく面倒くさいです。個人でGitHubチックに使いたいのであれば、間違いなくGitHubを使いましょう。それが、あなたの為です。GitLabは、企業ユースでGitHubがNGの場合のみ使うのが良いのではないでしょうか。インストールは面倒臭いものの、使いはじめると中々便利です。Gitの管理者の手間も少なくなり、またコードの共有も進むことでしょう。
 でもやっぱり面倒くさいと思うので、Amazon Linux AMIでインストール済みのイメージを公開しようと思います。gitlabからgitへの認証キーの作成の部分を、対話式で行えるようなバッチを作ってから提供したいと思いますので、今しばらくお待ちください。


See Also:
Amazon-LinuxにRVMを利用してApache+Passenger+Railsのインストール
StatSVNのGit版 GitStatsを使ってみる
Gitのフック機能で、リポジトリをAmazon S3にバックアップする
Git+DropBoxで、プライベートリポジトリ作成。或いはGitをAmazon S3でバックアップ
GitLabのPublic AMIを公開しました。



参照:
gitlabhq/doc/install/installation.md at stable · gitlabhq/gitlabhq · GitHub
Trouble Shooting Guide · gitlabhq/gitlab-public-wiki Wiki · GitHub
CentOS6にGitLabをインストールする方法 | Ryuzee.com
CentOS6.2でGitLabのインストール - おおらかにいこう
Amazon Linux RVM/Ruby1.9/Apache2/Passenger3環境構築 - 130単位
ローカルで GitHub を構築! Git リポジトリ管理ツール「GitLab」を Mac OS X にインストールしてみた | クラスメソッド開発ブログ