継続的インテグレーションツール「GitLab CI」を Amazon Linux にインストールしてみた
はじめに
継続的インテグレーション (以下CI) とは、アプリ開発時の品質向上・納期短縮を目的とした習慣のことです。「アプリのテストやビルドの自動化」というと分かりやすいでしょうか。CI を支援するツールは Jenkins が有名ですが、今回は GitLab 製の CI ツール「GitLab CI」を Amazon Linux にインストールして使ってみました。その手順をメモしておきたいと思います。
本エントリの内容は前回のエントリ「社内 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 番を通すように修正しましょう。
以上でインストール・セットアップ完了です!ブラウザで見てみましょう。
デフォルトで admin は以下でログインできます。
user: admin@local.host pass: 5iveL!fe
GitLab CI を使ってみる
GitLab のプロジェクトと連携させる
ということで GitLab CI を使ってみたいと思います!ログイン後、まずはプロジェクトを作成してみましょう。と、その前に CI 対象のプロジェクトがないといけませんね。。GitLab からプロジェクトを新規作成し、適当に Ruby アプリケーションを作って push しました。
次に GitLab CI でプロジェクトを作成します。下図のような感じです。
ここで問題がひとつ。リポジトリの場所ってどこだ…
どうやら、一度リポジトリを 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 のリポジトリを連携させましょう。Details を見てみます。
この中の GitLab 3.1+ の欄に書いてある ProjectURL と ProjectToken を GitLab に設定します。ということで GitLab のプロジェクトを開き「Service」画面を開き「GitLab CI」を選択します。
ここに貼り付けて完了です。あとは push されるタイミングでビルドが走るようになります。ちなみに「Test setting」を押すとその場でビルドされます。
GitHub のプロジェクトと連携させる
GitLab CI は GitHub とも連携できます!というわけで試してみました。まずは GitHub に先ほどの Ruby アプリプロジェクトのリポジトリを作成。
そして (やっぱりここが微妙なのですが) リポジトリを手動で clone します。。
sudo su - gitlab_ci mkdir github_projects && cd github_projects git clone https://github.com/suwa-yuki/sample_project.git
これでプロジェクトを作成できます。作成後は Details で以下の Hook 用の URL をコピーします。
コピーした URL は GitHub のリポジトリから「Settings」の「Service Hooks」の「WebHook URLs」に貼り付けます。ここでも「Test Hook」を押すと Hook できているか確認することができます。
これで連携できました!
まとめ
CI ツールは Jenkins が主流ですが GitLab CI もなかなかシンプルで使いやすそうですね。Ruby on Rails でできているので Ruby アプリを CI する環境はサクサク作れます。機能は Jenkins にかなり劣りますが…今後に期待ですね!