PHPをGitLab CIで自動テストして結果をGitLab Pagesで表示する
以前こちらで
GitLab Runnerを使ってGitLab Pagesを表示してみたのですが、
CIするなら自動テストがしたい。
さらに、結果のレポートをGitLab Pagesで表示できれば
いい感じじゃないかと思ったのでやってみました。
実行用コンテナイメージ作成
phpunitなどを実行させるためのコンテナを作成します。
今回参考にさせていただいたのは
こちら
のサイト様です。
Dockerfileで作成しました。
FROM centos:centos7
RUN yum -y update && \
yum -y install git php php-xml libxslt
RUN curl -LsS https://getcomposer.org/installer | php && \
mv composer.phar /usr/local/bin
RUN composer.phar global require phpmd/phpmd && \
composer.phar global require sebastian/phpcpd && \
composer.phar global require phpunit/phpunit
ENV PATH $PATH:~/.composer/vendor/bin/
Dockerfileを元にイメージをビルドし、プライベートレジストリにプッシュします。
GitLab連携のレジストリ構築手順は
こちら
を参考にしてください。
先にGitLabで適当なプロジェクトを作成してください。
今回は「php-ci-sample」としました。
任意の場所にDockerfileを保存して以下のコマンドを実行します。
% docker build -t example.tsuchinokometal.com/pages/php-ci-sample .
% docker push example.tsuchinokometal.com/pages/php-ci-sample
うまくいけば以下のようになると思います。
ジョブの実行
ここの手順は
こちら
とほぼ同じですので、
リンク先を参考に3つのジョブがpassedするようにしてください。
ただ、.gitlab-ci.ymlは以下のようにプッシュしたイメージを指定してください。
image: example.tsuchinokometal.com/pages/php-ci-sample:latest
phpcpd_job:
stage: test
script:
- phpcpd class
phpmd_job:
stage: test
script:
- phpmd class text cleancode,codesize,design,unusedcode
phpunit_job:
stage: test
script:
- phpunit test
プロジェクトにプッシュした際、以下のエラーが発生した場合は、
GitLabを起動しているサーバーで自己証明書を信頼する必要があります。
手順は
こちら
を参照してください。
Pulling docker image example.tsuchinokometal.com/pages/php-ci-sample:latest ...
ERROR: Preparation failed: Error response from daemon: Get https://example.tsuchinokometal.com/v2/: x509: certificate signed by unknown authority (docker.go:196:0s)
フォルダ構成は以下のようになります。
php-ci-sample
│
├── .gitlab-ci.yml
├── class
│ ├── SampleAbstractClass.php
│ ├── SampleClass1.php
│ └── SampleClass2.php
└── test
├── SampleClass1Test.php
└── SampleClass2Test.php
うまくいけば以下のようになると思います。
phpunitのジョブを確認すると、以下のようにテストが全て通っていることがわかるのですが、php慣れしてない身としてはもうちょっとわかりやすく結果を見せて欲しいものです。
$ phpunit test
PHPUnit 4.8.36 by Sebastian Bergmann and contributors.
......
Time: 44 ms, Memory: 4.00MB
OK (6 tests, 6 assertions)
というわけで、htmlで出力します。
phpunitのログHTML出力とPagesにデプロイ
phpunit.xmlを作成してxmlでログを出力し、それをxsltprocでhtmlに出力します。
phpunit.xmlは以下のようにしました。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit>
<logging>
<log type="junit" target="phpunit-junit-log.xml" logIncompleteSkipped="false"/>
</logging>
</phpunit>
xsltprocで使うxsltファイルは
こちら
で公開されているものを使います。
リンク先にも書いてありますが、以下のようなコマンドでhtmlファイルに変換するわけですね。
xsltproc phpunit.xslt phpunit-junit-log.xml > output.html
上記コマンドの実行と、GitLab Pagesへのデプロイを.gitlab-ci.ymlに追記します。
image: example.tsuchinokometal.com/pages/php-ci-sample:latest
phpcpd_job:
stage: test
script:
- phpcpd class
phpmd_job:
stage: test
script:
- phpmd class text cleancode,codesize,design,unusedcode
phpunit_job:
stage: test
script:
- phpunit test
- xsltproc phpunit.xslt phpunit-junit-log.xml > index.html
artifacts:
paths:
- index.html
pages:
stage: deploy
script:
- mkdir .public
- cp index.html .public
- mv .public public
artifacts:
paths:
- public
フォルダ構成は以下のようになります。
php-ci-sample
│
├── .gitlab-ci.yml
├── class
│ ├── SampleAbstractClass.php
│ ├── SampleClass1.php
│ └── SampleClass2.php
├── phpunit.xml
├── phpunit.xslt
└── test
├── SampleClass1Test.php
└── SampleClass2Test.php
うまくいけば以下のようになると思います。
artifactsにindex.htmlを指定したので成果物としてダウンロードできるようになっています。
また、GitLab Pagesでもindex.htmlが確認できます。