gitlabの導入方法のメモ

こんにちは。小宮です。先輩から要望されていそうな気がしたのでgitlab導入時のメモです。。

やたらめったら長いし手順が複雑でこのとおりやって再現できるかはお使いの環境に依存する可能性があり保障できかねます。 この手順で再現した環境はOSはCentOS6.5でした。 postgresを許容できるのであれば自動的に入れられるオムニバス版があるのでそちらをお使いいただくのがよろしいかと。 個人的にpostgresの運用の知見が心もとなかったのと、RDSに逃げられなくなるのがアレだったのでmysqlで頑張りました。

自分で自動化する時は、passengerとgitlab:setup時の対話処理をなんとか自動化するオプションを付けるとこがキモかと思いました。 この手順自体は部分的にchefがでてきますがほぼ手動です。自動化オプションは最後のほうにちょろっと書いときます。

1.このへんからmysqlをなんとかして入れとく
$ wget http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-5.6.17-1.linux_glibc2.5.x86_64.rpm-bundle.tar -P site-cookbooks/mysqld/files/default/usr/local/src/
2.rbenv等でrubyをなんとかして入れておく

(chefでなにもせずにやるとchefgemに寄るので注意がひつよう) rubyのバージョンが低いとGemfileのシンタックスチェックでエラー出てmysql2とかが入らないことも。

3.Gitのインストール
    # yum -y install libcurl-devel libxslt-devel libxml2-devel expat-devel gettext openssl-devel zlib-devel
Installed:
  libcurl-devel.x86_64 0:7.19.7-37.el6_4        libxml2-devel.x86_64 0:2.7.6-14.el6
  libxslt-devel.x86_64 0:1.1.26-2.el6_3.1

Dependency Installed:
  libgcrypt-devel.x86_64 0:1.4.5-11.el6_4      libgpg-error-devel.x86_64 0:1.7-4.el6


# su - chef;cd infra-chef-repo/

$ knife cookbook create git -o site-cookbooks
$ knife cookbook create redis -o site-cookbooks
$ vi site-cookbooks/git/recipes/default.rb
#
# Cookbook Name:: git
# Recipe:: default
#
# Copyright 2014, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
%W{libcurl-devel
 libxslt-devel
 libxml2-devel
 expat-devel
 gettext
 openssl-devel
 zlib-devel
 libgcrypt-devel
 libgpg-error-devel}.each do |pkg|
  package pkg do
    not_if "rpm -qa|grep #{pkg}"
    action :install
  end
end
bash "bash-install-git" do
  not_if "ls -d /usr/local/src/git-1.9.0"
  code <<-EOC
    wget https://git-core.googlecode.com/files/git-1.9.0.tar.gz -P /usr/local/src
    cd /usr/local/src/
    tar zxf git-1.9.0.tar.gz
    cd /usr/local/src/git-1.9.0
    ./configure --prefix=/usr/local/git
    make all
    make install
    ln -sf /usr/local/git/bin/git* /usr/local/bin/
  EOC
end

$ knife solo cook localhost -o git

    # wget https://git-core.googlecode.com/files/git-1.9.0.tar.gz -P /usr/local/src

    # cd /usr/local/src/
    # tar zxf git-1.9.0.tar.gz
    # cd /usr/local/src/git-1.9.0
    # ./configure --prefix=/usr/local/git
    # make all
    # make install

    # ln -s /usr/local/git/bin/git* /usr/local/bin/
# which git
/usr/local/bin/git
# git --version
git version 1.9.0
4.redisのインストール
    # yum install -y --enablerepo=remi redis
    Installed:
      redis.x86_64 0:2.8.9-1.el6.remi

    Dependency Installed:
      gperftools-libs.x86_64 0:2.0-11.el6.3            libunwind.x86_64 0:1.1-2.el6

    # /etc/init.d/redis start

    # chkconfig redis on

# redis-cli ping
PONG

$ vi site-cookbooks/redis/recipes/default.rb
bash "yum-install-redis-from-remi" do
  not_if "which redis-cli"
  code <<-EOC
    yum install -y --enablerepo=remi redis
  EOC
end

service "redis" do
  supports :status => true, :restart => true
  action [ :enable, :start ]
end
$ knife cookbook test redis
$ knife solo cook localhost -o redis
5.ユーザ作成
# useradd -c 'GitLab' git
# chmod 755 /home/git

# su - git -s /bin/bash

$ mkdir .ssh
$ touch .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
$ chmod 700 .ssh
$ git config --global user.name  "GitLab"
$ git config --global user.email "gitlab@localhost"

##### 6.gitlab-shellのインストール
$ git clone https://github.com/gitlabhq/gitlab-shell.git -b v1.9.4
$ cp -a /home/git/gitlab-shell/config.yml{.example,}
$ /home/git/gitlab-shell/bin/install

install失敗する場合は、gitユーザの.bashrcか/etc/profile.d/の下あたりに環境変数を追加し読み込みしてから再実行
export PATH=/path-to-ruby:$PATH
8.gitlabインストール
$ git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 6-8-stable gitlab

$ cp -a /home/git/gitlab/config/gitlab.yml{.example,}

不要っぽい
--------------------------
$ chmod -R u+rwX  /home/git/gitlab/log/
$ chmod -R u+rwX  /home/git/gitlab/tmp/
$ mkdir /home/git/gitlab/tmp/pids/
$ mkdir /home/git/gitlab/tmp/sockets/
$ chmod -R u+rwX  /home/git/gitlab/tmp/pids/
$ chmod -R u+rwX  /home/git/gitlab/tmp/sockets/
$ mkdir /home/git/gitlab/public/uploads
$ chmod -R u+rwX  /home/git/gitlab/public/uploads
--------------------------

$ mkdir /home/git/gitlab-satellites
$ ll -d /home/git/gitlab-satellites
drwxrwxr-x 2 git git 4096  5月 19 12:20 2014 /home/git/gitlab-satellites
$ 
$ ll -d /home/git/gitlab-satellites
drwxr-x--- 2 git git 4096  5月 19 12:20 2014 /home/git/gitlab-satellites

$ cp -a /home/git/gitlab/config/unicorn.rb{.example,}

$ cp -a /home/git/gitlab/config/initializers/rack_attack.rb{.example,}

$ cd /home/git/gitlab
$ git config --global user.name "GitLab"
$ git config --global user.email "gitlab@localhost"
$ git config --global core.autocrlf input
9.DB設定
$ cp -a /home/git/gitlab/config/database.yml{.mysql,}

$ vi /home/git/gitlab/config/database.yml
$ diff /home/git/gitlab/config/database.yml{.mysql,}
10,12c10,12
<   username: git
<   password: "secure password"
<   # host: localhost
---
>   username: gitxxxxx
>   password: "xxxxxxxx"
>   host: localhost

$ ls -al /home/git/gitlab/config/database.yml
-rw-rw-r-- 1 git git 777  5月 19 12:32 2014 /home/git/gitlab/config/database.yml
$ chmod o-rwx /home/git/gitlab/config/database.yml
$ ls -al /home/git/gitlab/config/database.yml
-rw-rw---- 1 git git 777  5月 19 12:32 2014 /home/git/gitlab/config/database.yml

$ vi /home/git/gitlab/config/gitlab.yml
$ diff /home/git/gitlab/config/gitlab.yml{,.example}
227c227
<     bin_path: /usr/local/bin/git
---
>     bin_path: /usr/bin/git

ローカル等てきとうなところ(database.ymlに指定したところ)にDBをなんとかしていれる

# rpm -ivh /usr/local/src/MySQL-shared-5.6.17-1.linux_glibc2.5.x86_64.rpm

 MySQL-develとshared-compatもひつようかもしれない     rubyのバージョンが1.8とか1.9とかだとGemfileのシンタックスがどうとかで入らなくて直にmysql2をいれてたけどたぶんbundleで普通にはいるはず     # gem install mysql2 -v '0.3.11'

10.Gemパッケージインストール
$ exit
# yum -y install libicu-devel.x86_64
Installed:
  libicu-devel.x86_64 0:4.2.1-9.1.el6_2

Dependency Installed:
  libicu.x86_64 0:4.2.1-9.1.el6_2
※引っかかる場合は、MySQL-develが足りない

# su - git -s /bin/bash
$ cd /home/git/gitlab
$ bundle install --deployment --without development test postgres aws
11.データベース初期化&セットアップ

ここはdbのテーブルが新規に作成される処理なので、間違って既存のデータ消さないように対話になってたりします。

$ bundle exec rake gitlab:setup RAILS_ENV=production
This will create the necessary database tables and seed the database.
You will lose any previous data stored in the database.
Do you want to continue (yes/no)? yes

Administrator account created:

login.........admin@local.host
password......xxxxxxxxx

$ bundle exec rake assets:precompile RAILS_ENV=production

$ exit
12.起動スクリプト、ログローテ設定コピー
# cp -a /home/git/gitlab/lib/support/init.d/gitlab /etc/rc.d/init.d/
# cp -a /home/git/gitlab/lib/support/logrotate/gitlab /etc/logrotate.d/

# chkconfig gitlab on
# chkconfig --list gitlab
gitlab          0:off   1:off   2:on    3:on    4:on    5:on    6:off

# /etc/init.d/gitlab start
13.Passengerのインストール&Proxy設定
# yum -y install httpd-devel
Installed:
  httpd-devel.x86_64 0:2.2.15-30.el6.centos

Dependency Installed:
  apr-devel.x86_64 0:1.3.9-5.el6_2             apr-util-devel.x86_64 0:1.3.9-3.el6_0.1
  apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1       httpd.x86_64 0:2.2.15-30.el6.centos
  httpd-tools.x86_64 0:2.2.15-30.el6.centos

Complete!

Specが低いとcompileに失敗するので、Swapを1GB作成

# dd if=/dev/zero of=/swap bs=1M count=1024
# mkswap /swap
# swapon /swap

# gem install passenger --no-rdoc --no-ri

# passenger-install-apache2-module

Config作成(rubyのバージョンごとに違うので要注意)
# cat <<EOF >/etc/httpd/conf.d/passenger.conf
> LoadModule passenger_module /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/passenger-4.0.42/buildout/apache2/mod_passenger.so
> <IfModule mod_passenger.c>
> PassengerRoot /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/passenger-4.0.42
> PassengerDefaultRuby /opt/chef/embedded/bin/ruby
> </IfModule>
> EOF


Vhostは必要ないので、defaultに書込み
# cat <<EOF >>/etc/httpd/conf/httpd.conf
> ProxyPass / http://localhost:8080/
> ProxyPassReverse / http://localhost:8080/
> EOF

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

# su - git -s /bin/bash
$ cd /home/git/gitlab
$ bundle exec rake gitlab:env:info RAILS_ENV=production

RAILS_ENV=production

System information
System:
Current User:   git
Using RVM:      no
~略~
Redis version >= 2.0.0? ... yes
Your git bin path is "/usr/local/bin/git"
Git version >= 1.7.10 ? ... yes (1.9.0)

Checking GitLab ... Finished

ブラウザからログインしてパスワードを変更 http://123.123.123.123/users/sign_in admin@local.host xxxxxxxx

プロジェクトを作成などなど http://123.123.123.123/root/test

自動化オプションについて 正直、自動化したい処理にchefとかdockerとか適当(ほどよくという意味)につけてググれば だいたいやってる人がいてわかるとは思いますが念の為書いておきます。

・passenger

bash "passenger-install-apache2-module" do
  not_if "find /opt/chef/embedded/lib -print|grep mod_passenger.so"
  code <<-EOC
    passenger-install-apache2-module install --auto
  EOC
end

・gitlab

bash "db_initialize,precompile" do
  user "git"
  not_if "mysql -u #{dbuser} -p#{rootpass} -h #{dbhost} -e 'use gitlabhq_production;show tables;'|grep users_projects"
  code <<-EOC
    cd /home/git/gitlab
    export PATH=/opt/chef/embedded/bin:$PATH
    /opt/chef/embedded/bin/bundle install --deployment --without development test postgres aws
    /opt/chef/embedded/bin/bundle exec rake gitlab:setup force=yes RAILS_ENV=production
    /opt/chef/embedded/bin/bundle exec rake assets:precompile RAILS_ENV=production
  EOC
end

自動化するにあたり他にも色々地雷があったわけですが、、 mysql2を入れるにあたり、公式のmysqlだとmysql_libは消してsharedとshared-compatとdevelいれないといけない等々。 あとはssl化したりdbを外出ししたり色々やったような記憶はありますが長くなるので省略します。 あとchefgemに寄ってるレシピは適宜変えたほうがよさそうです。

14.バックアップとリストアについて

mysqlの場合はDBサーバに以下のようなgrantをしないとダメです(user@host等固有の値は適宜ご指定ください)

mysql> GRANT LOCK TABLES ON `gitlabhq_production`.* TO 'gitlab'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> show grants for 'gitlab'@'localhost' ;

バックアップはユーザはgitで場所は$HOME/gitlabでやらないとだめみたいな感じです。(cron登録しとくのが良いかと思います)

#!/bin/bash
export PATH=/opt/chef/embedded/bin:$PATH
export LD_LIBRARY_PATH=/opt/chef/embedded/lib:$LD_LIBRARY_PATH

cd /home/git/gitlab
bundle exec rake gitlab:backup:create RAILS_ENV=production
w
echo "rake backup end."

リストアする場合、  gitlab.ymlでbackupディレクトリとして指定してる(ext:$HOME/gitlab/tmp/backups)場所にtarアーカイブを設置

bundle exec rake RAILS_ENV=production gitlab:backup:restore BACKUP=tmp/backups/1425914208 --trace

こんなかんじでtarアーカイブの先頭に自動でついてる数値文字列をbackupのpathの後ろに指定。

とりあえずこんなところで失礼します。長々みていただいた方はありがとうございました。