Coverageの計測をxdebugからpcovに変えたら、CIの実行時間が5分の1になった
PCOVなるものを使うと、CIがめっちゃ早くなるという情報を得て、早速CIに導入してみました
pcovとは
超高速にCoverageの計測が出来るドライバーです。
こちら を確認してみると2019/1/16に初めてリリースされた、かなり新しめのプロジェクトのようですね
動作要件はPHP7.1以上です
インストールはpeclもしくはソースからビルド出来ます。僕はpeclでインストールしました。
詳しくはこちら
CI用Dockerコンテナの作り直し
今まではxdebugで計測していたので、その部分をpcovに変更します。
(CircleCIのconfig.ymlで直接xdebugのインストールしている人は適宜読み替えてください)
FROM php:7.3 # 中略 - RUN pecl install xdebug \ - && docker-php-ext-enable xdebug + RUN pecl install pcov \ + && docker-php-ext-enable pcov
そして、書き直したDockerfileをビルドし直して、DockerHubにあげておきます。
cd /path/to/docker
docker build -t {DockerHubのアカウント名}/php_for_circleci .
docker push {DockerHubのアカウント名}/php_for_circleci:latest
CircleCIのconfigを修正
イメージに先ほどのコンテナを指定しておき、テストの実行方法を指定します。
version: 2
jobs:
test:
docker:
- image: {DockerHubのアカウント名}/php_for_circleci:latest
# 中略
+ - run:
+ name: test
+ command: php -d pcov.directory=./ -d pcov.exclude=./tests vendor/bin/codecept run --coverage-xml
ポイントは、 php -d pcov.directory=./ -d pcov.exclude=./tests の部分で、 -d オプションでiniの設定をオーバーライドしてます。
pcov.directory は、カバレッジ計測対象のディレクトリを指定します。
ここが指定されていない場合は、カレントディレクトリからsrc、lib、appの順にディレクトリを探し、そのディレクトリ内のカバレッジを計測するようです。*1
つまりデフォルトの状態では、計測対象のディレクトリがsrcでもlibでもappでもない場合はカバレッジの計測をしてくれないことになります。
pcov.exclude はカバレッジ計測から除外するディレクトリを指定します。
pcov.directoryにテストコードのディレクトリが含まれている場合は、そのディレクトリのカバレッジを計測してもマシンリソースの無駄なので除外します。
複数ディレクトリを除外したい場合は -d pcov.exclude="~(foo|bar)~" のような書き方をします。
僕は実行時のオプションでディレクトリの指定をしていますが、php.iniに設定を書き込んでも問題ないと思います
おわり
なんとこれだけのステップで導入出来ます。
実質pcovをインストールするだけですね
僕の場合は、ユニットテストが5.5minほど掛かっていたのですが、1minまで短縮されました。
よかったですね。