Ubuntu で GitLab を Omnibus に移行し GitLab CI も使い始める

インストールが大変という定評のあった GitLab ですが、マニュアルインストールとアップグレードで凌いでいました。

GitLab CI を導入しようと試す過程で、サブディレクトリ運用だと OAuth 連携が上手くいかないことがわかりました。

現在はオールインワンのパッケージが提供されているため、下記を使えば簡単に GitLab, GitLab CI を一気に入れることができます。Nginx、PostgreSQL、Redis なども全てまとめて /opt/gitlab に入ります。 GitLab | Download GitLab Community Edition (CE)

サーバスペックをアップグレードするついでに上げますが、基本的にバーチャルホストを使うため FQDN を GitLab, GitLab CI で同じにできません。SSL 証明書に関しては、ワイルドカードを持ってないと辛いところです。

GitLab を最新に更新

下記の手順どおりやれば簡単に今は上がります。

gitlabhq/upgrader.md at master · gitlabhq/gitlabhq · GitHub

バックアップ

$ cd /home/git/gitlab
$ sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production

サービス停止

$ sudo service gitlab stop

アップグレード

$ sudo -u git -i
$ bundle exec rake gitlab:backup:create RAILS_ENV=production
$ cd gitlab
$ ruby bin/upgrade.rb 
GitLab 7 upgrade tool
Your version is 7.5.3
Latest available version for GitLab 7 is 7.7.2
Newer GitLab version is available
Do you want to upgrade (yes/no)? yes
Stash changed files
 -> git stash
Saved working directory and index state WIP on 7-5-stable: b656b85 Version 7.5.3
HEAD is now at b656b85 Version 7.5.3
 -> OK
Get latest code
 -> git fetch
remote: Counting objects: 7452, done.                                                  
remote: Compressing objects: 100% (3095/3095), done.                                   
remote: Total 7452 (delta 5170), reused 6001 (delta 4268)                              
Receiving objects: 100% (7452/7452), 2.18 MiB | 387.00 KiB/s, done.
Resolving deltas: 100% (5170/5170), done.
From https://github.com/gitlabhq/gitlabhq
(省略)
 * [new tag]         v7.7.2     -> v7.7.2
 -> OK
Switch to new version
 -> git checkout v7.7.2
Note: checking out 'v7.7.2'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at bd98290... Version 7.7.2
 -> OK
Install gems
 -> bundle
Fetching source index from https://rubygems.org/
(省略)
Your bundle is complete!
Gems in the groups development, test and postgres were not installed.
It was installed into ./vendor/bundle
 -> OK
Migrate DB
 -> bundle exec rake db:migrate
(省略)

 -> OK
Recompile assets
 -> bundle exec rake assets:clean assets:precompile
(省略)
 -> OK
Clear cache
 -> bundle exec rake cache:clear
 -> OK
Done

サービス起動

$ sudo service gitlab start

このタイミングで自分の環境では、rbenv で入っていたのが、2.1.3 で 2.1.5 じゃないとエラーが出ました。 /home/git/gitlab/.ruby-version を 2.1.5 に書き換えたら動きました。

$ sudo service nginx restart

更新後のチェック

$ sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production

GitLab Shell の更新

$ sudo -u git -i
$ cd gitlab-shell
$ git fetch
$ sudo -u git -H git checkout v`cat /home/git/gitlab/GITLAB_SHELL_VERSION`

データを MySQL から PostgreSQL に移行

現状のサーバでは MySQL をデータベースにしていましたが、Omnibus では PostgreSQL になってしまうのでコンバートする必要がありました。

GitLab.org / GitLab Community Edition | GitLab

バックアップを利用するため Converting a GitLab backup file from MySQL to Postgres を参照しました。

$ sudo -u git -i
$ cd gitlab
$ bundle exec rake gitlab:backup:create RAILS_ENV=production

最新のバックアップ tar ファイル名を確認します。

$ ls -ltr tmp/backups/

最新の tar を一時ディレクトリに移動

$ mkdir -p tmp/backups/postgresql
$ mv tmp/backups/<タイムスタンプ>_gitlab_backup.tar tmp/backups/postgresql/
$ cd tmp/backups/postgresql

DBスキーマPostgreSQL 対応でダンプします。

$ mysqldump --compatible=postgresql --default-character-set=utf8 -r gitlabhq_production.mysql -u root gitlabhq_production

コンバーターを落としてきます。

$ git clone https://github.com/gitlabhq/mysql-postgresql-converter.git

スキーマを変換して、バックアップ tar の中の のスキーマ SQL ファイルを置き換えます。

$ mkdir db
$ python mysql-postgresql-converter/db_converter.py gitlabhq_production.mysql db/database.sql
$ tar rf <タイムスタンプ>_gitlab_backup.tar db/database.sql

<タイムスタンプ>_gitlab_backup.tar を新規サーバに転送します。

GitLab CE Omnibus package のインストール

ここから先は新サーバでの作業になります。

パッケージをインストール

$ sudo apt-get install openssh-server
$ sudo apt-get install postfix
$ wget https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.7.2-omnibus.5.4.2.ci-1_amd64.deb
$ sudo dpkg -i gitlab_7.7.2-omnibus.5.4.2.ci-1_amd64.deb

設定

/etc/gitlab/gitlab.rb を編集します。

以下、GitLab の FQDNgitlab.example.com、GitLab CI の FQDNci.example.com とします。

external_url 'http://gitlab.example.com/'
ci_external_url 'http://ci.example.com/'

設定を反映させます。

$ sudo gitlab-ctl reconfigure

一連のサービスが起動します。Nginx が 80、Unicorn が 8080 ポートを使うので気を付けましょう。

$ sudo gitlab-ctl start

データベースバックアップをリストア

先ほどのバックアップアーカイブを /var/opt/gitlab/backups に移動して復元コマンドを実行します。

$ mv <タイムスタンプ>_gitlab_backup.tar /var/opt/gitlab/backups/
$ sudo gitlab-rake gitlab:backup:restore 

GitLab と GitLab CI を連携

GitLab (http://gitlab.example.com/) にブラウザからログインします。 「Admin area」→「Applications」を開き、[New Application] を押して、Name に「GitLab CI」, Redirect URL に「http://ci.example.com/user_sessions/callback」を登録します。

Application IdSecret が表示されるので、/etc/gitlab/gitlab.rb を編集して以下の行を追記します。

gitlab_ci['gitlab_server'] = { 'url' => 'http://gitlab.example.com', 'app_id' => "<Application Id>", 'app_secret' => '<Secret>'}

これを反映させます。

$ sudo gitlab-ctl reconfigure
$ sudo gitlab-ctl restart

以上で、GitLab と GitLab CI をシングルサインオンにできます。

GitLab CI Runner のインストール

最後に実際ビルドテストを行うランナーをインストールします。

gitlabhq/gitlab-ci-runner · GitHub を参考にしますが、ちょっとそのままだとできないところがありました。

依存パッケージをインストール

$ sudo apt-get update -y
$ sudo apt-get install -y wget curl gcc libxml2-dev libxslt-dev libcurl4-openssl-dev libreadline6-dev libc6-dev libssl-dev make build-essential zlib1g-dev openssh-server git-core libyaml-dev postfix libpq-dev libicu-dev

gitlab_ci_runner ユーザーを追加

ユーザーを追加します。

$ sudo adduser --disabled-login --gecos 'GitLab Runner' gitlab_ci_runner
$ sudo -u gitlab_ci_runner -i

rbenv と ruby-build で Ruby をインストール

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ type rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install 2.1.5
$ rbenv global 2.1.5

bundler をインストール

$ gem install bundler

gitlab-ci-runner をインストール

$ git clone https://gitlab.com/gitlab-org/gitlab-ci-runner.git
$ cd gitlab-ci-runner
$ bundle install --deployment
$ bundle exec ./bin/setup

最後のコマンドは対話式に GitLab CI の URL とトークンを入力します。トークンは GitLab CI の Runners ページに表示されます。

サービスに登録

$ exit
$ cd /home/gitlab_ci_runner/gitlab-ci-runner
$ sudo cp lib/support/upstart/gitlab-ci-runner.conf /etc/init/
$ cd /etc/init.d
$ sudo ln -s /lib/init/upstart-job gitlab-ci-runner

ランナー設定

rbenv の設定を /etc/init/gitlab-ci-runner.confScript に定義します。

script
  # optional: set PATH or other environment variables
  export HOME=/home/gitlab_ci_runner
  export PATH=$HOME/.rbenv/bin:$PATH
  eval "$(rbenv init -)"
  exec bundle exec bin/runner
end script

ランナー起動

$ sudo service gitlab-ci-runner start

後は、Web画面から対象リポジトリを追加して、Jobとしてテストコマンドを定義すると、CI が実行できるようになります。