Laravelのテスト(PHPUnit)で出したカバレッジをCodeBuildのレポート機能で出そうとしたところ、一部詰まるところがあったのでメモです。
(php:alpineコンテナでカバレッジ出すまでの設定については以下で解説しています。)
PHP AlpineコンテナにXdebugをインストールしLaravelのカバレッジ表示を有効化する
TL;DR
--coverage-clover
は読み込めない。
--coverage-cobertura
を使う。
経緯
Laravelの php artisan test
の --coverage-clover
オプションでClover形式のカバレッジレポートを出力できます。
CodeBuildも file-format: CLOVERXML
に対応しているのでこれで問題なくカバレッジレポートを使用できるように見えます。
Dockerfile
FROM php:8.2-fpm-alpine
# Composerインストール
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Xdebugをインストールした後、依存パッケージを削除
RUN apk add --no-cache --virtual .xdebug-deps $PHPIZE_DEPS linux-headers \
&& pecl install xdebug \
&& docker-php-ext-enable xdebug \
&& apk del -f .xdebug-deps
# Xdebugの設定
RUN echo 'xdebug.mode=develop,debug,coverage' >> /usr/local/etc/php/conf.d/99-xdebug.ini
COPY . /var/www/html
RUN composer install
RUN cp .env.example .env
buildspec.xml
version: 0.2
phases:
build:
on-failure: ABORT
commands:
- docker build -t laravel-coverage .
post_build:
on-failure: ABORT
commands:
- docker run --rm --volume $PWD/coverage:/var/www/html/coverage
laravel-coverage ash -c "php artisan key:generate && php artisan test --coverage-cobertura coverage/coverage.xml"
reports:
laravel-coverage:
files:
- coverage/coverage.xml
file-format: COBERTURAXML
artisan testのヘルプには --coverage-clover
オプションは書かれていませんが実際にはPHPUnitのオプションが通ります。
しかしこれでClover形式のXMLが出力されたにも関わらず、CodeBuildのログは以下のようなエラーが出ており、ビルド失敗となりレポートも表示できません。
[Container] 2023/02/12 06:55:31 Phase complete: UPLOAD_ARTIFACTS State: SUCCEEDED
[Container] 2023/02/12 06:55:31 Phase context status code: Message:
Error in UPLOAD_ARTIFACTS phase: [laravel-coverage: [error processing report: [InvalidParameter: 19 validation error(s) found.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[0].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[1].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[2].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[3].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[4].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[5].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[6].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[7].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[8].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[9].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[10].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[11].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[12].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[13].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[14].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[15].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[16].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[17].FilePath.
- minimum field size of 1, BatchPutCodeCoveragesInput.RequestEntries[18].FilePath.
InvalidInputException: Report status is invalid]]]
エラーで検索したところ、GitHubにIssueがありました。
AWS CodeBuild not recognize Clover XML format report #828
上記でDuplicateとしてリンクされているIssueを見ると
Generated Clover XML logfiles do not validate against clover.xsd #578
vnrmc commented on Mar 25, 2021
@jimdelois use cobertura as small workaround (–coverage-cobertura, available since phpunit 9.4) and modify your buildpec:
… reports: codecoverage: … file-format: ‘COBERTURAXML’
直ってはいないようですがPHPUnitは9.4からCobertura形式もサポートしているのでそっちを使うといいよと書いてありました。
なのでCoberturaを使ってみます。
解決
buildspec.yml
version: 0.2
phases:
build:
on-failure: ABORT
commands:
- docker build -t laravel-coverage .
post_build:
on-failure: ABORT
commands:
# --coverage-coberturaに変更
- docker run --rm --volume $PWD/coverage:/var/www/html/coverage
laravel-coverage ash -c "php artisan key:generate && php artisan test --coverage-cobertura coverage/coverage.xml"
reports:
laravel-coverage:
files:
- coverage/coverage.xml
# ここのフォーマット指定も変更
file-format: COBERTURAXML
これでCobertura形式のXMLを出力し、無事CodeBuildでレポートを確認することができました。
(やたら長い名前なのはCDKで作ったからです。)
コメント