🗂️
Laravel + Docker + PHPUnit + GitHubActions テストカバレッジをPRに出力する
概要
先日、phperkaigi2022に参加してテスト結果の見える化とテスト文化を根付かせるための活動がよかったので、実際に導入してみた
なお、ワークフローについてもっと良い方法をご存知の方は、マサカリいただけると助かります
やり方
ワークフローを定義します
カバレッジを全て表示すると見づらいので必要な箇所だけを切り取りしてPRコメントに出力するようにします
ブラウザ上でカバレッジを見たい場合
出力形式はいくつかあるので公式を参考に設定ください
HTML形式で出力したい場合は以下のコマンドをLaravelコンテナ内で実行してください
phpdbg -qrr ./vendor/bin/phpunit --coverage-html ./coverage
解説
MySQLコンテナ起動後、実行するまでに時間を要しますがテストが先に開始されるとConnection Refused
で接続ができません。
今回は3分弱時間を置いてからテストプロセスに進めるように設定しました
docker-compose exec -T laravel bash -c "sleep 200"
ワークフローの実行契機を設定します
今回はmain
ブランチにプルリクエストを発行すると実行されるトリガーを設定します
on:
# PR契機
pull_request:
branches: [ main ]
.github/workflows/test.yml
name: PhpUnitCoverage
on:
# PR契機
pull_request:
branches: [ main ]
jobs:
build:
# 実行環境
runs-on: ubuntu-latest
steps:
# $GITHUB_WORKSPACE配下のリポジトリをチェックアウトしてアクセス可能にする
- uses: actions/checkout@v2
- name: dokcer-compose Laravel Init
run: |
docker-compose up -d
docker-compose exec -T laravel bash -c "composer install"
docker-compose exec -T laravel bash -c "cp .env.example .env"
docker-compose exec -T laravel bash -c "php artisan key:generate"
docker-compose exec -T laravel bash -c "php artisan config:cache"
docker-compose exec -T laravel bash -c "sleep 200"
- name: Exec Phpunit
run: |
docker-compose exec -T laravel bash -c "phpdbg -qrr ./vendor/bin/phpunit --coverage-text --colors=never > storage/logs/coverage.log"
docker-compose exec -T laravel bash -c "cat storage/logs/coverage.log"
- name: Cat Test Result
run: |
cat ./src/laravel/storage/logs/coverage.log
if: ${{ failure() }}
- name: Sed Coverage Report
run: |
sed -E "s/"$'\E'"\[([0-9]{1,2}(;[0-9]{1,2})*)?m//g" | \
grep "Code Coverage Report:" -A6 ./src/laravel/storage/logs/coverage.log | sed -e "s/^ *//" | sed -e "s/ *$//" | sed -e "/^ *$/d" > ./src/laravel/storage/logs/coverage-summary.log
- name: Read coverage summary
id: coverage-summary
uses: juliangruber/read-file-action@v1
with:
path: ./src/laravel/storage/logs/coverage-summary.log
- name: Comment Coverage Summary
uses: marocchino/sticky-pull-request-comment@v2
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
header: coverage-summary
message: |
## Coverage Summary
${{ steps.coverage-summary.outputs.content }}
Discussion