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?
 
  
  
  
  
コメント