Laravelでカバレッジを表示する php artisan test --coverage
を使いたかったのでDockerのphp:fpm-alpineイメージをXdebugをインストールする方法を調べました。
TL;DR
コマンドライン
apk add $PHPIZE_DEPS
apk add linux-headers
pecl install xdebug
docker-php-ext-enable xdebug
echo 'xdebug.mode=develop,debug,coverage' >> /usr/local/etc/php/conf.d/99-xdebug.ini
# テスト実行
php artisan test --coverage
# レポートファイル作成(HTML)
php artisan test --coverage-html [出力ディレクトリ名]
# レポートファイル作成(Clover形式)
php artisan test --coverage-clover [出力XMLファイル名]
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
(composerのインストールについてはこちらで解説しています↓)
[PHP] Dockerイメージに1行でcomposerをインストールする方法とその解説
経過とエラーなど
とりあえずpecl install xdebugを試してみる。
$ docker run -it --rm php:8.2-fpm-alpine ash
/var/www/html # pecl install xdebug
downloading xdebug-3.2.0.tgz ...
Starting to download xdebug-3.2.0.tgz (245,775 bytes)
....................................................done: 245,775 bytes
96 source files, building
running: phpize
Configuring for:
PHP Api Version: 20220829
Zend Module Api No: 20220829
Zend Extension Api No: 420220829
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
ERROR: `phpize' failed
autoconfが無いと言われるのでインストールしてみるもまだダメです。
/var/www/html # apk add autoconf
(中略)
/var/www/html # pecl install xdebug
(中略)
configure: error: in `/tmp/pear/temp/pear-build-defaultuserJMnodj/xdebug-3.2.0':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
ERROR: `/tmp/pear/temp/xdebug/configure --with-php-config=/usr/local/bin/php-config' failed
コンパイラが無いと言われていますね。
調べてみたところ、phpizeの依存パッケージはPHPIZE_DEPSという環境変数にまとめてくれているようです。
/var/www/html # echo $PHPIZE_DEPS
autoconf dpkg-dev dpkg file g++ gcc libc-dev make pkgconf re2c
これをapk addでインストールしたあとでxdebugをインストールしてみます。
/var/www/html # apk add $PHPIZE_DEPS
(中略)
/var/www/html # pecl install xdebug
(中略)
configure: error: rtnetlink.h is required, install the linux-headers package: apk add --update linux-headers
ERROR: `/tmp/pear/temp/xdebug/configure --with-php-config=/usr/local/bin/php-config' failed
まだエラーが出ます。
メッセージ通りにlinux-headersを入れて再度試します。
/var/www/html # apk add linux-headers
/var/www/html # pecl install xdebug
(中略)
Build process completed successfully
Installing '/usr/local/lib/php/extensions/no-debug-non-zts-20220829/xdebug.so'
install ok: channel://pecl.php.net/xdebug-3.2.0
configuration option "php_ini" is not set to php.ini location
You should add "zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20220829/xdebug.so" to php.ini
インストール成功しました。
更にDockerではdocker-php-ext-enableを使ってxdebugを有効化します。
/var/www/html # docker-php-ext-enable xdebug
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/x86_64/APKINDEX.tar.gz
(1/1) Installing .docker-php-ext-enable-deps (20230205.075006)
OK: 305 MiB in 61 packages
(1/1) Purging .docker-php-ext-enable-deps (20230205.075006)
OK: 305 MiB in 60 packages
php artisan testの–coverageオプションが通るか試してみます。
# php artisan test --coverage
ERROR Code coverage driver not available. Did you set Xdebug's coverage mode?
どうやらXdebugの設定値を変えなければいけないようです。
iniに設定値を追加します。
/var/www/html # echo 'xdebug.mode=develop,debug,coverage' >> /usr/local/etc/php/conf.d/99-xdebug.ini
これで
/var/www/html # php artisan test --coverage
PASS Tests\Unit\ExampleTest
✓ that true is true
PASS Tests\Feature\ExampleTest
✓ the application returns a successful response
Tests: 2 passed
Time: 0.45s
–coverageオプションが通りました!
ちなみに php artisan test --help
には出てきませんが、phpunitのコマンドラインオプションである --coverage-html
や --coverage-xml
はphp artisan testにも直接通ります。
# レポートファイル作成(HTML)
php artisan test --coverage-html [出力ディレクトリ名]
# レポートファイル作成(Clover形式)
php artisan test --coverage-clover [出力XMLファイル名]
参考
PHPUnit Command-Line Options
Xdebug Documentation – all settings
How do I install XDebug on docker’s official php-fpm-alpine image?
コメント