PHP AlpineコンテナにXdebugをインストールしLaravelのカバレッジ表示を有効化する

スポンサーリンク

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?

スポンサーリンク
スポンサーリンク
LaravelPHPRecord
シェアする
フォローする

コメント