Symfony2プロジェクトをGitLabで管理してVagrantで立てたJenkinsでCIする(5)

第5回です。

前回のおさらい
イテレーション C: JenkinsをVagrantで構築する
世に公開されているcookbooksをかき集めてJenkinsを立ち上げました。

今回の内容
いよいよプロジェクトをJenkinsに設定し、CIしてみます。


いまどこ?

  1. イテレーション 0: 準備
    1. タスク 0-1: 必要なソフトウェアをインストールする
    2. タスク 0-2: GitLabのアカウントを作成する
  2. イテレーション A: Symfony2でプロジェクトをはじめる
    1. タスク A-1: Symfony2プロジェクトを作成する
    2. タスク A-2: GitLabでソースコードを管理する
    3. タスク A-3: PHPUnitを導入する
  3. イテレーション B: Phingでプロジェクトをビルドする
    1. タスク B-1: Phingを導入する
    2. タスク B-2: PhingとPHPUnitを連携する
  4. イテレーション C: JenkinsをVagrantで構築する
    1. タスク C-1: VMを初期化する
    2. タスク C-2: 構築に必要なCookbooksを取得・作成する
    3. タスク C-3: Jenkinsを起動する
  5. イテレーション D: JenkinsでCIする ←いまココ!
    1. タスク D-1: Jenkinsにプロジェクトを設定する
    2. タスク D-2: テストレポートを表示できるように設定する
    3. タスク D-3: コードカバレッジレポートを表示できるように設定する
  6. イテレーション E: 各種ツールの導入
    1. タスク E-1 PHPMDを導入する
    2. タスク E-2 PHPCSを導入する


イテレーション D: JenkinsでCIする

タスク D-1: Jenkinsにプロジェクトを設定する

  • Gitプラグインのインストール

GitLabからプロジェクトの変更を取得するためにJenkinsがGitを扱えるようにならないといけません。
そのためのプラグインをアップデートセンターからインストールします。
http://192.168.33.10:8080/pluginManager/available にアクセスし、右上の「フィルター」から「Git Plugin」で検索すると、

Git Plugin
   This plugin allows use of Git as a build SCM. Git 1.3.3 or newer is required.

が表示されるので、チェックします。「ダウンロードして再起動後にインストール」をぽちり。
「プラグインのインストール/アップグレード」画面が表示されるので、「インストール完了後、ジョブがなければJenkinsを再起動する」にチェックし、しばし、待ちます。

  • GitLabにDeploy Keyを設定する

GitLabからプロジェクトの変更を取得するためのもうひとつの作業として、Jenkins実行ユーザーのSSH公開鍵をGitLabに追加する必要があります。
Jenkinsサーバー上での作業が必要となりますが、jenkinsユーザーのデフォルトshellが「/bin/false」になっているため、まずはそこを有効にします。

C:\Users\{$user}\VirtualBox VMs\centos> vagrant ssh
Last login: Tue May 21 21:30:14 2013 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$ sudo vi /etc/passwd

jenkins:x:497:498:Jenkins Continuous Build server:/var/lib/jenkins:/bin/false

最後の「/bin/false」を「/bin/bash」に変更します。

ssh-keygenします。パスフレーズは空にしてます。

[vagrant@localhost ~]$ sudo su - jenkins
-bash-4.1$ ssh-keygen -t rsa -C "jenkins@localhost"
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/jenkins/.ssh/id_rsa):
Created directory '/var/lib/jenkins/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

「~/.ssh/id_rsa.pub」の内容を

https://gitlab.com/{$user_name}/symfony2/deploy_keys/new

から登録します。

一度接続を行い、GitLabのホスト公開鍵をknown_hostsに追加しておきます。

-bash-4.1$ git ls-remote -h git@gitlab.com:{$user_name}/symfony2.git HEAD
The authenticity of host 'gitlab.com (54.243.197.170)' can't be established.
RSA key fingerprint is b6:03:0e:39:97:9e:d0:e7:24:ce:a3:77:3e:01:42:09.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitlab.com,54.243.197.170' (RSA) to the list of known hosts.

これをしておかないと、次の「ジョブの作成」で以下のエラーに苦しめられます。

Failed to connect to repository : Command "git ls-remote -h git@gitlab.com:{$user_name}/symfony2.git HEAD" returned status code 128:
stdout:
stderr: Host key verification failed.
fatal: The remote end hung up unexpectedly

  • ジョブの作成

プロジェクトをビルドするためのジョブを新規に作成します。
http://192.168.33.10:8080/newJob にアクセス。
「ジョブ名」に「Symfony2」を入力、「フリースタイル・プロジェクトのビルド」にチェックし、「OK」ボタンを押します。
f:id:piccagliani:20130521125504p:plain

ジョブの設定画面に進みますので、「ソースコード管理」と「ビルド」の箇所を設定します。

ソースコード管理」の設定
Gitを選択し、リポジトリのURLを入力します。
f:id:piccagliani:20130521132219p:plain

「ビルド」の設定
「ビルド手順の追加」から「シェルの実行」を選択し、以下の内容を記入します。

/usr/local/bin/composer install --dev
bin/phing

f:id:piccagliani:20130521134901p:plain

もはや説明は不要だと思いますが、ここでやっていることは以下の2つです。。

  1. Composerで依存関係をインストール
  2. Phingでビルド

これでビルド出来る状態になりましたので、「保存」ボタンを押して設定変更を反映します。

  • ビルドしてみる!

設定変更が完了すると「プロジェクト Symfony2」画面に遷移するので、右のナビゲーションから「ビルド実行」をクリックします。
しばらくしたら、http://192.168.33.10:8080/job/Symfony2/1/console にてコンソール出力を確認します。
どきどきしながら待ちます。
f:id:piccagliani:20130521135655p:plain
初回のビルドでは依存関係のインストールが行われるので、結構な時間がかかります。

最終的に、コンソールに以下のような出力がされれば、ビルド成功です。

BUILD FINISHED

Total time: 14.4189 seconds
[m
Finished: SUCCESS

http://192.168.33.10:8080/job/Symfony2/ws/build/logs/coverage/index.html
にアクセスして、カバレッジレポートが出力されていることも確認します。


ここまでですでにお腹いっぱいですが、もうちょっと続きます。

タスク D-2: テストレポートを表示できるように設定する

Symfony2ジョブの設定画面にアクセスします。
http://192.168.33.10:8080/job/Symfony2/configure

「ビルド後の処理」から「JUnitテスト結果の集計」を選択します。
「テスト結果XML」に

build/logs/phpunit.xml

を入力します。
f:id:piccagliani:20130521142327p:plain

変更を保存し、再度ビルドします。
ビルド後、プロジェクトのトップ画面に「テスト結果の推移」が表示されれば成功です。
(ただし、2回目以降に表示されます)
f:id:piccagliani:20130521143344p:plain

タスク D-3: コードカバレッジレポートを表示できるように設定する

プラグインマネージャから、「Clover PHP plugin」をインストールします。
インストールが完了したら、Symfony2ジョブの設定画面にアクセスします。
http://192.168.33.10:8080/job/Symfony2/configure

「ビルド後の処理」から「Clover PHP カバレッジレポートを集計」を選択し、以下のように設定します。
f:id:piccagliani:20130521143704p:plain

変更を保存し、再度ビルドします。

ビルド後、プロジェクトのトップ画面に「Clover HTMLレポート」が表示されれば成功です。
f:id:piccagliani:20130521143941p:plain

最後に

「CIする」とか書いておきながら、この段階ではまだ「CI」の「Continuous」が実現できていません。
GitLabへのpushをトリガーにビルドを実行するように設定する必要があります。
そのあたりはもうちょっと後で(調査中・・・)。。。。


以上です。

第6回はイテレーション E: 各種ツールの導入