ちょっと話題の記事

継続的インテグレーションツール「GitLab CI」を Amazon Linux にインストールしてみた

2013.03.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

継続的インテグレーション (以下CI) とは、アプリ開発時の品質向上・納期短縮を目的とした習慣のことです。「アプリのテストやビルドの自動化」というと分かりやすいでしょうか。CI を支援するツールは Jenkins が有名ですが、今回は GitLab 製の CI ツール「GitLab CI」を Amazon Linux にインストールして使ってみました。その手順をメモしておきたいと思います。

gitlab_ci10

本エントリの内容は前回のエントリ「社内 GitHub を実用的に構築! Amazon VPC 環境に GitLab サーバを構築してみた」で構築した環境をベースにしている前提です。本エントリの手順は GitLab の環境構築後、試してみてください。

GitLab CI をインストールする

ユーザの作成

まずは gitlab_ci というユーザを作成します。ただそれだけです。

sudo su -
adduser -c 'GitLab CI' gitlab_ci

Ruby のインストール

今回も rbenv を使ってインストールします。

Ruby のインストールはやたらと重いので、EC2 インスタンスを一時的に small 以上に変更しておくことを推奨します。Ruby インストール後は元に戻して OK です。

su - gitlab_ci
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
 
# 環境変数を反映させるため、再ログイン
exit
su - gitlab
 
mkdir -p ~/.rbenv/plugins
cd ~/.rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git
rbenv install 1.9.3-p385
rbenv global 1.9.3-p385
gem install bundler --no-ri --no-rdoc

# 再ログイン後 bundler が使えるようになる
exit

データベースの設定

次に MySQL に GitLab CI 用のユーザーとデータベースを作成します。前回のエントリと同じ構成のため RDS に対して設定します。

# root で作業
sudo su -
mysql -h gitlab-db-instance.cqdinqe8kf7z.ap-southeast-1.rds.amazonaws.com -u user -p
mysql> CREATE USER 'gitlab_ci'@'localhost' IDENTIFIED BY 'password';
mysql> CREATE DATABASE IF NOT EXISTS `gitlab_ci_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlab_ci_production`.* TO 'gitlab_ci'@'localhost';
mysql> exit

GitLab CI のインストール

いよいよ GitLab CI のインストールです。基本的に GitLab とあまり変わりはありません。。GitHub から clone してデータベースの設定を書き換え、セットアップ用の Rake タスクを実行して完了です。

# gitlab_ci で作業
sudo su - gitlab_ci

git clone https://github.com/gitlabhq/gitlab-ci.git
cd gitlab-ci
mkdir -p tmp/pids
bundle --without development test

# RDS に接続できるように設定を変更する
cp config/database.yml.mysql config/database.yml
vim config/database.yml

# セットアップ
bundle exec rake db:setup RAILS_ENV=production
bundle exec whenever -w RAILS_ENV=production

# 以下は root で作業
exit
sudo su -

# 自動起動設定
curl --output /etc/init.d/gitlab_ci https://raw.github.com/gitlabhq/gitlab-ci/master/lib/support/init.d/gitlab_ci
chmod +x /etc/init.d/gitlab_ci
chkconfig gitlab_ci on
/etc/init.d/gitlab_ci start

database.yml は以下のように修正します。

database.yml

#
# PRODUCTION
#
production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: gitlab_ci_production
  pool: 5
  username: user
  password: password
  host: ********.********.ap-northeast-1.rds.amazonaws.com
  socket: /tmp/mysql.sock

nginx の設定

インストール完了後 nginx でリバースプロキシを設定します。

curl --output /etc/nginx/sites-available/gitlab_ci https://raw.github.com/gitlabhq/gitlab-ci/master/lib/support/nginx/gitlab_ci
ln -s /etc/nginx/sites-available/gitlab_ci /etc/nginx/sites-enabled/gitlab_ci

# 設定を変更する
vim /etc/nginx/sites-enabled/gitlab_ci

/etc/init.d/nginx restart

ポートは 80 番を GitLab が使用しているため 8080 番にしました。

/etc/nginx/sites-enabled/gitlab_ci

# GITLAB CI
# Maintainer: @randx
# App Version: 2.0

upstream gitlab_ci {
  server unix:/home/gitlab_ci/gitlab-ci/tmp/sockets/gitlab-ci.socket;
}

server {
  listen 8080;         # e.g., listen 192.168.1.1:80;
  server_name ci.gitlab.org;     # e.g., server_name source.example.com;
  root /home/gitlab_ci/gitlab-ci/public;

なお Security Group の設定も 8080 番を通すように修正しましょう。

gitlab_ci01

以上でインストール・セットアップ完了です!ブラウザで見てみましょう。

gitlab_ci02

デフォルトで admin は以下でログインできます。

user: admin@local.host
pass: 5iveL!fe

gitlab_ci03

GitLab CI を使ってみる

GitLab のプロジェクトと連携させる

ということで GitLab CI を使ってみたいと思います!ログイン後、まずはプロジェクトを作成してみましょう。と、その前に CI 対象のプロジェクトがないといけませんね。。GitLab からプロジェクトを新規作成し、適当に Ruby アプリケーションを作って push しました。

gitlab_ci04

次に GitLab CI でプロジェクトを作成します。下図のような感じです。

gitlab_ci05

ここで問題がひとつ。リポジトリの場所ってどこだ…
どうやら、一度リポジトリを clone してこないといけないみたいです。適当な場所に clone しておきます。

# git ユーザーに追加
sudo su -
usermod -G git gitlab_ci
exit

# clone
sudo su - gitlab_ci
mkdir projects && cd projects
git clone /home/git/repositories/sample_project.git

これでプロジェクトが作成できます。

gitlab_ci06

次に、作成したプロジェクトと GitLab のリポジトリを連携させましょう。Details を見てみます。

gitlab_ci07

この中の GitLab 3.1+ の欄に書いてある ProjectURL と ProjectToken を GitLab に設定します。ということで GitLab のプロジェクトを開き「Service」画面を開き「GitLab CI」を選択します。

gitlab_ci08

gitlab_ci09

ここに貼り付けて完了です。あとは push されるタイミングでビルドが走るようになります。ちなみに「Test setting」を押すとその場でビルドされます。

gitlab_ci10

GitHub のプロジェクトと連携させる

GitLab CI は GitHub とも連携できます!というわけで試してみました。まずは GitHub に先ほどの Ruby アプリプロジェクトのリポジトリを作成。

gitlab_ci11

そして (やっぱりここが微妙なのですが) リポジトリを手動で clone します。。

sudo su - gitlab_ci
mkdir github_projects && cd github_projects
git clone https://github.com/suwa-yuki/sample_project.git

これでプロジェクトを作成できます。作成後は Details で以下の Hook 用の URL をコピーします。

gitlab_ci12

コピーした URL は GitHub のリポジトリから「Settings」の「Service Hooks」の「WebHook URLs」に貼り付けます。ここでも「Test Hook」を押すと Hook できているか確認することができます。

gitlab_ci13

これで連携できました!

gitlab_ci14

まとめ

CI ツールは Jenkins が主流ですが GitLab CI もなかなかシンプルで使いやすそうですね。Ruby on Rails でできているので Ruby アプリを CI する環境はサクサク作れます。機能は Jenkins にかなり劣りますが…今後に期待ですね!

参考