Symfony2プロジェクトをGitLabで管理してVagrantで立てたJenkinsでCIする(5)
第5回です。
- 前回のおさらい
- イテレーション C: JenkinsをVagrantで構築する
世に公開されているcookbooksをかき集めてJenkinsを立ち上げました。
- 今回の内容
- いよいよプロジェクトをJenkinsに設定し、CIしてみます。
いまどこ?
イテレーション 0: 準備タスク 0-1: 必要なソフトウェアをインストールするタスク 0-2: GitLabのアカウントを作成する
イテレーション A: Symfony2でプロジェクトをはじめるイテレーション B: Phingでプロジェクトをビルドするタスク B-1: Phingを導入するタスク B-2: PhingとPHPUnitを連携する
イテレーション C: JenkinsをVagrantで構築するタスク C-1: VMを初期化するタスク C-2: 構築に必要なCookbooksを取得・作成するタスク C-3: Jenkinsを起動する
- イテレーション D: JenkinsでCIする ←いまココ!
- タスク D-1: Jenkinsにプロジェクトを設定する
- タスク D-2: テストレポートを表示できるように設定する
- タスク D-3: コードカバレッジレポートを表示できるように設定する
- イテレーション E: 各種ツールの導入
- タスク E-1 PHPMDを導入する
- タスク 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」に変更します。
[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」ボタンを押します。
ジョブの設定画面に進みますので、「ソースコード管理」と「ビルド」の箇所を設定します。
「ソースコード管理」の設定
Gitを選択し、リポジトリのURLを入力します。
「ビルド」の設定
「ビルド手順の追加」から「シェルの実行」を選択し、以下の内容を記入します。
/usr/local/bin/composer install --dev bin/phing
もはや説明は不要だと思いますが、ここでやっていることは以下の2つです。。
- Composerで依存関係をインストール
- Phingでビルド
これでビルド出来る状態になりましたので、「保存」ボタンを押して設定変更を反映します。
- ビルドしてみる!
設定変更が完了すると「プロジェクト Symfony2」画面に遷移するので、右のナビゲーションから「ビルド実行」をクリックします。
しばらくしたら、http://192.168.33.10:8080/job/Symfony2/1/console にてコンソール出力を確認します。
どきどきしながら待ちます。
初回のビルドでは依存関係のインストールが行われるので、結構な時間がかかります。
最終的に、コンソールに以下のような出力がされれば、ビルド成功です。
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: テストレポートを表示できるように設定する
http://192.168.33.10:8080/job/Symfony2/configure
「ビルド後の処理」から「JUnitテスト結果の集計」を選択します。
「テスト結果XML」に
build/logs/phpunit.xml
を入力します。
変更を保存し、再度ビルドします。
ビルド後、プロジェクトのトップ画面に「テスト結果の推移」が表示されれば成功です。
(ただし、2回目以降に表示されます)
タスク D-3: コードカバレッジレポートを表示できるように設定する
インストールが完了したら、Symfony2ジョブの設定画面にアクセスします。
http://192.168.33.10:8080/job/Symfony2/configure
「ビルド後の処理」から「Clover PHP カバレッジレポートを集計」を選択し、以下のように設定します。
変更を保存し、再度ビルドします。
ビルド後、プロジェクトのトップ画面に「Clover HTMLレポート」が表示されれば成功です。
最後に
「CIする」とか書いておきながら、この段階ではまだ「CI」の「Continuous」が実現できていません。
GitLabへのpushをトリガーにビルドを実行するように設定する必要があります。
そのあたりはもうちょっと後で(調査中・・・)。。。。
以上です。