【PHP版】CI(継続的インテグレーション)ツール導入ガイド:第5回 CI サーバーの構築(GitLabを利用し、CIサーバーを構築する手順)

前記事は、第4回 さまざまなジョブ(2) その他の抑えておきたいツールの紹介を紹介した。CIツール導入ガイド 第5回は、GitLabを利用し、CIサーバーを構築する手順を紹介する。

GitLab は GitHub クローンとして有名だが、現在は CIツールとしての機能が実装されている。今回は GitLab をインストールし、実際に CIサーバーを構築してみよう。

インストール環境

gitLab はさまざまな環境にインストール可能だが、今回は CentOS7 を利用する事にした。まずはCentOS7 を minimal インストールしたサーバーを用意して欲しい。もちろん仮想マシンでも構わない。ただし、インストール時にかなりのメモリを消費するので、最低でも8GB 程度のメモリを利用可能な環境を用意して頂きたい。AWS を利用するなら、 t2.large 程度がお勧めだ。HDD容量は今回の検証だけなら20GBもあれば十分だ。

GitLab本体のインストール

GitLab は標準の yum リポジトリには含まれていないが、以下の手順で簡単にインストール可能だ。<サイトのドメイン名>の部分には、このサーバーのドメイン名を指定して欲しい。IPアドレスでもオーケーだ。なお、インストールの終了と同時に HTTP アクセスが可能になるので注意して欲しい。通常、CIサーバーはイントラネット内に設置する事が多いだろう。しかしAWSのようなクラウドサービスを利用するなら、事前にファイヤーウォール等で特定 IPアドレスからのみ利用可能なように設定しておこう。

curl -LsS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
EXTERNAL_URL="http://<サイトのドメイン名>" sudo yum install -y gitlab-ce

インストールには少し時間が掛かる。AWS の t2.large で試した所、5分程度掛かった。インストールが終了すると、以下のような画面が表示される。

Running handlers:
Running handlers complete
Chef Client finished, 432/613 resources updated in 03 minutes 31 seconds
gitlab Reconfigured!

       *.                  *.
      ***                 ***
     *****               *****
    .******             *******
    ********            ********
   ,,,,,,,,,***********,,,,,,,,,
  ,,,,,,,,,,,*********,,,,,,,,,,,
  .,,,,,,,,,,,*******,,,,,,,,,,,,
      ,,,,,,,,,*****,,,,,,,,,.
         ,,,,,,,****,,,,,,
            .,,,***,,,,
                ,*,.



     _______ __  __          __
    / ____(_) /_/ /   ____ _/ /_
   / / __/ / __/ /   / __ `/ __ \
  / /_/ / / /_/ /___/ /_/ / /_/ /
  \____/_/\__/_____/\__,_/_.___/


Thank you for installing GitLab!
GitLab should be available at http://???.???.???.???

For a comprehensive list of configuration options please see the Omnibus GitLab readme
https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md

  Verifying  : gitlab-ce-11.1.4-ce.0.el7.x86_64                                                                                      1/1

Installed:
  gitlab-ce.x86_64 0:11.1.4-ce.0.el7

Complete!

 http://???.???.???.??? 

と記載してある部分は、実際には GitLab のURLになる。このURLにブラウザからアクセスすると初期パスワードの設定画面になるので、適当なパスワードを設定しよう。

パスワードの設定が完了すると、ログイン画面に移動する。ユーザー名を root 、パスワードを今設定したパスワードでログインできる事を確認しよう。

ログインが成功すると以下のような画面に移動する。


Runner のインストール

Runner とは色々なジョブの実行を制御するツールだ。以下のようにインストールする。

curl -LsS https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
sudo yum install -y gitlab-ci-multi-runner

Docker のインストール

Docker とは仮想環境を作成、実行するためのプラットフォームだ。CI のさまざまなジョブを実行する時は、冪等性(べきとうせい)が要求される。冪等性とはある操作を何度行っても同じ結果になる事を示す概念だ。ジョブを実行する時の OS の状態が毎回異なると、冪等性が保たれない可能性がある。Docker では簡単に仮想環境を初期状態に戻す事ができるため、CIのジョブを実行する環境として便利だ。GitLab の実行環境として Docker が対応しているのでインストールしておこう。

インストールは以下の通りである。

sudo yum install -y docker

インストールが完了したら、GitLab が Docker を利用できるようにグループの設定を行う。

sudo groupadd docker
sudo gpasswd -a gitlab-www docker

最後に自動起動の設定を行い、docker サービスを起動しよう。

sudo systemctl enable docker.service
sudo systemctl start docker

実行環境の作成と起動

Docker をインストールしたので、次に Docker でコンテナを作成しよう。コンテナとは Docker上で動作するそれぞれの環境の事であり、ここで作成したコンテナが各種ジョブを実行する実行環境となる。最初にコンテナで利用するOSのイメージをインストールしておく必要があるので、以下の手順で CentOS7 のコンテナを利用可能にしよう。

sudo docker pull centos:centos7

次にコンテナを起動し、ログインしてみよう。以下のコマンドでコンテナの起動と、そのコンテナへのログインを同時に実行できる。

sudo docker run -it centos:centos7 /bin/bash

上記コマンドを実行し、プロンプトが変化したらログインに成功している。ここではコンテナを起動して root でログインしているのだが、 ESXi や Hyper-V 等の他の仮想環境を利用した事があると、起動までのあまりの速さに驚くかも知れない。これは Docker が Linux コンテナ技術を利用した仮想環境であるためだ。詳細は Docker の関連記事等を参照して頂きたい。

各ツールのインストール

コンテナにログインした状態で、利用するツールをインストールしよう。今回は第3回で利用した PHPMD, PHPCPD, PHPUnit をインストールする事にする。コンテナ内に居る事を確認し、以下の手順を実行しよう。

PHP本体のインストール

yum install -y php php-xml

composer のインストール

curl -LsS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin

各ツールのインストール

composer.phar global require phpmd/phpmd
composer.phar global require sebastian/phpcpd
composer.phar global require phpunit/phpunit

3つのツールがインストールされた事を確認するために、実行可能ファイルが保存されているディレクトリを見てみよう。以下のように4つのシンボリックリンクが存在していれば成功している。

# ls -l ~/.composer/vendor/bin/
total 0
lrwxrwxrwx. 1 root root 34 Aug 15 23:39 pdepend -> ../pdepend/pdepend/src/bin/pdepend
lrwxrwxrwx. 1 root root 26 Aug 15 23:39 phpcpd -> ../sebastian/phpcpd/phpcpd
lrwxrwxrwx. 1 root root 28 Aug 15 23:39 phpmd -> ../phpmd/phpmd/src/bin/phpmd
lrwxrwxrwx. 1 root root 26 Aug 15 23:40 phpunit -> ../phpunit/phpunit/phpunit

実行環境の保存

これまでの手順でジョブの実行環境が整った。次に今作った実行環境を保存しておこう。Docker ではコンテナ内で行った作業は明示的に保存しない限り保存されない。まずは CTRL+P, CTRL+Q を順に押してコンテナを起動したまま抜けよう。exit コマンドを実行したり CTRL+D を押してログアウトすると、変更が保存されないままコンテナが終了してしまうので要注意だ。

ホストOS に戻ったら、

 sudo docker ps 

コマンドを実行する。これは現在実行中のコンテナの一覧を表示するコマンドだ。実行結果は以下のようになる。

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
90d074f06d57        centos:centos7      "/bin/bash"         10 minutes ago      Up 10 minutes                           serene_mestorf

一番左に表示されている「コンテナID」は、実行中のそれぞれのコンテナに紐づくIDだ。今はひとつのコンテナだけが立ち上がっているので上記のような感じで表示される。

コンテナID を確認したら、

 sudo docker commit 

コマンドを利用してコンテナ を保存する。

sudo docker commit <コンテナID> <名前>

コンテナID は

 docker ps 

コマンドで取得したコンテナIDを、名前にはこのコンテナの名前を指定する。今回は phptest という名前にしておこう。コンテナIDが 90d074f06d57 だとしたら、コマンドラインは以下の通りだ。

sudo docker commit 90d074f06d57 phptest

無事保存できたら今実行しているコンテナは終了して構わない。以下のコマンドで終了しよう。

sudo docker stop <コンテナID>

Runner の登録

ジョブを実行するコンテナが作成できたので、Runner を作成し、GitLab に登録しよう。まずWEB画面から上部メニューのスパナアイコンをクリックし、左サイドメニューから Runners をクリックしよう。URLは /admin/runners になる。

 Setup a shared Runner manually 

という項目にトークンが表示されるので、このトークンをメモしておこう。

次にコマンドラインに戻り

 gitlab-ci-multi-runner 

を実行する。実行中に色々と入力が要求されるが、以下のように進めていく。

$ sudo gitlab-ci-multi-runner register
Running in system-mode.

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://<サーバーのドメイン名>/
Please enter the gitlab-ci token for this runner:

Please enter the gitlab-ci description for this runner:
[(概要を入力するのだが、デフォルトではドメイン名が表示されている)]:<改行>
Please enter the gitlab-ci tags for this runner (comma separated):
<環境に付けるタグ名>
Whether to run untagged builds [true/false]:
[false]:<タグ無しのビルドを実行するかどうか>
Whether to lock Runner to current project [true/false]:
[false]:<改行>
Registering runner... succeeded                     runner=nsWDyXM_
Please enter the executor: parallels, ssh, kubernetes, docker, docker-ssh, shell, virtualbox, docker+machine, docker-ssh+machine:
<実行環境の種類>
Please enter the default Docker image (e.g. ruby:2.1):
<実行するDockerのイメージ>
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

<>内が入力する部分だ。<環境に付けるタグ名>と<実行するDockerのイメージ> には、

 phptest 

と入力して欲しい。<タグ無しのビルドを実行するかどうか>には

 true 

を、<実行環境の種類> には

 docker 

と入力する。

実際に入力したイメージは以下のような感じになる(’?’の部分はサイトごとに異なる)。

$ sudo gitlab-ci-multi-runner register
Running in system-mode.

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://???.???.???.???/
Please enter the gitlab-ci token for this runner:
????????????????????
Please enter the gitlab-ci description for this runner:
[??????????????????????????????????????????????]:
Please enter the gitlab-ci tags for this runner (comma separated):
phptest
Whether to run untagged builds [true/false]:
[false]: true
Whether to lock Runner to current project [true/false]:
[false]:
Registering runner... succeeded                     runner=gduponxa
Please enter the executor: docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine, ssh, docker+machine, kubernetes:
docker
Please enter the default Docker image (e.g. ruby:2.1):
phptest
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

登録完了後に /admin/runners をリロードすると、以下のスクリーンショットのように作成した Runner が表示されている。

まとめ

ここまでで構築作業は完了だ。次回は検証用のプロジェクトを作成し、実際に動作させてみよう。(第6回 CIサーバーを使ってみよう 第5回で構築したGitLabで、実際にCIを行った様子の紹介


社内サーバにリモートリポジトリを作るのも一つですが、「開発にまつわる面倒事」をこの際全部、tracpath(トラックパス)に任せてみませんか?
バージョン管理サービス・プロジェクト管理サービスの「tracpath(トラックパス)」では、
ユーザー5名、リポジトリ数3つまで、無料で利用可能です。

さっそく実務でも使って見ましょう。
自らも開発を行う会社が作ったからこそ、開発チームの「作る情熱」を支える、やるべきことに集中出来るサービスになっています。
エンタープライズ利用が前提のASPサービスなので、セキュリティも強固です。