CentOS (Vagrant) × JenkinsでPHPUnit実行


JenkinsでPHPUnitを動かすまでなかなか手こずったのでメモ
JenkinsからGitHub上のプロジェクトを取得しPHPUnitを実行します。

## 環境
* VirtualBox 4.3.20
* Vagrant 1.7.2
* CentOS 7
* PHPUnit 4.6
* Jenkins 1.614
* GitHub
	* https://github.com/taisa007/phpunit


## VagrantにJenkinsをセットアップ

バージョンは変えましたが[こちら](http://t32k.me/mol/log/vagrant1-2-centos6-4-jenkins1-5/)の記事を元に環境設定します。

vagrant up時にエラーが発生した場合は[こちら](http://qiita.com/osamu1203/items/10e19c74c912d303ca0b)を参考

CentOS7ではiptablesがfirewalldに変わっているので以下のコマンドでポートを解放します。

```
firewall-cmd --add-port=8080/tcp --zone=public --permanent

```

## Jenkins に plugin 追加

- Git Plugin
- Phing Plugin

## Jenkins に必要な設定を追加

### Git

今回はjenkinsからGithubへアクセスできるように直接jenkinsサーバへ設定を追加します。

```
cd /var/lib/jenkins
sudo mkdir .ssh
sudo vi .ssh/id_rsa
# Github への秘密鍵を追加
# 権限変更
sudo chown -R jenkins:jenkins .ssh/
sudo chmod 400 .ssh/id_rsa
# アクセス確認
sudo -u jenkins ssh -T git@github.com
Hi taisa007! You've successfully
```

### PHP

- PHP 5.6 インストール
	- [こちら](http://qiita.com/koichi_amami/items/e97bc70e82e95ab99f55) を参考 ※ CentoS7用

- composer
	- su -
	- curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin

- phpunit
	- [こちら](https://phpunit.de/manual/current/ja/installation.html) を参考
	- 今回は 4.6 を利用するので、url を https://phar.phpunit.de/phpunit-4.6.6.phar に変更

- phing
	- [こちら](http://www.spidersoft.com.au/2012/how-to-install-phing-on-centos/)を参考

## Jenkins へジョブを追加

参考ですが以下のように設定しました。

```build.xml
<?xml version='1.0' encoding='UTF-8'?>
<project>
  <actions/>
  <description></description>
  <keepDependencies>false</keepDependencies>
  <properties/>
  <scm class="hudson.plugins.git.GitSCM" plugin="git@2.3.5">
    <configVersion>2</configVersion>
    <userRemoteConfigs>
      <hudson.plugins.git.UserRemoteConfig>
        <url>git@github.com:taisa007/phpunit.git</url>
      </hudson.plugins.git.UserRemoteConfig>
    </userRemoteConfigs>
    <branches>
      <hudson.plugins.git.BranchSpec>
        <name>*/master</name>
      </hudson.plugins.git.BranchSpec>
    </branches>
    <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
    <submoduleCfg class="list"/>
    <extensions/>
  </scm>
  <canRoam>true</canRoam>
  <disabled>false</disabled>
  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  <triggers>
    <hudson.triggers.SCMTrigger>
      <spec>00 * * * *</spec>
      <ignorePostCommitHooks>false</ignorePostCommitHooks>
    </hudson.triggers.SCMTrigger>
  </triggers>
  <concurrentBuild>false</concurrentBuild>
  <builders>
    <hudson.plugins.phing.PhingBuilder plugin="phing@0.13.3">
      <targets>test</targets>
      <useModuleRoot>true</useModuleRoot>
    </hudson.plugins.phing.PhingBuilder>
  </builders>
  <publishers/>
  <buildWrappers/>
</project>
```

## Phing コマンドを実行してみる

jenkins 上で実行されるのは、以下のコマンドを実行しているのとほぼ同じなので、上手くいかない場合は一度 jenkins サーバ上で直接 phing コマンドを実行してみましょう。

```
cd /var/lib/jenkins/jobs/phpunit/workspace/
phing 
Buildfile: /var/lib/jenkins/jobs/phpunit/workspace/build.xml

Demo > test:

  [phpunit] Total tests run: 1, Failures: 0, Errors: 0, Incomplete: 0, Skipped: 0, Time elapsed: 0.00897 s

BUILD FINISHED

Total time: 0.1503 seconds
```

テストが実行され成功しました。

また、build.xml は、[こちら](https://github.com/mrook/phing-examples/blob/master/phpunit/build.xml)を元に設定を一部変更して利用しています。

## とりあえずテスト結果を集計して表示する

Phing の設定を report に変更し、ビルド後の処理の追加で、JUnitテスト結果の集計から設定を追加すると、ビルド結果を画面で確認することができます。

```
<?xml version='1.0' encoding='UTF-8'?>
<project>
  <actions/>
  <description></description>
  <keepDependencies>false</keepDependencies>
  <properties/>
  <scm class="hudson.plugins.git.GitSCM" plugin="git@2.3.5">
    <configVersion>2</configVersion>
    <userRemoteConfigs>
      <hudson.plugins.git.UserRemoteConfig>
        <url>git@github.com:taisa007/phpunit.git</url>
      </hudson.plugins.git.UserRemoteConfig>
    </userRemoteConfigs>
    <branches>
      <hudson.plugins.git.BranchSpec>
        <name>*/master</name>
      </hudson.plugins.git.BranchSpec>
    </branches>
    <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
    <submoduleCfg class="list"/>
    <extensions/>
  </scm>
  <canRoam>true</canRoam>
  <disabled>false</disabled>
  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  <triggers>
    <hudson.triggers.SCMTrigger>
      <spec>00 * * * *</spec>
      <ignorePostCommitHooks>false</ignorePostCommitHooks>
    </hudson.triggers.SCMTrigger>
  </triggers>
  <concurrentBuild>false</concurrentBuild>
  <builders>
    <hudson.plugins.phing.PhingBuilder plugin="phing@0.13.3">
      <targets>report</targets>
      <useModuleRoot>true</useModuleRoot>
    </hudson.plugins.phing.PhingBuilder>
  </builders>
  <publishers>
    <hudson.tasks.junit.JUnitResultArchiver plugin="junit@1.2-beta-4">
      <testResults>reports/*.xml</testResults>
      <keepLongStdio>false</keepLongStdio>
      <testDataPublishers/>
      <healthScaleFactor>1.0</healthScaleFactor>
    </hudson.tasks.junit.JUnitResultArchiver>
  </publishers>
  <buildWrappers/>
</project>
```