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

うまくいけば以下のようになると思います。

php-ci-sample_001.png

ジョブの実行

ここの手順は こちら とほぼ同じですので、
リンク先を参考に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

うまくいけば以下のようになると思います。

php-ci-sample_002.png

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を指定したので成果物としてダウンロードできるようになっています。

php-ci-sample_003.png

また、GitLab Pagesでもindex.htmlが確認できます。

php-ci-sample_004.png