🗂️

Laravel + Docker + PHPUnit + GitHubActions テストカバレッジをPRに出力する

2022/04/13に公開

概要

先日、phperkaigi2022に参加してテスト結果の見える化とテスト文化を根付かせるための活動がよかったので、実際に導入してみた

なお、ワークフローについてもっと良い方法をご存知の方は、マサカリいただけると助かります

https://speakerdeck.com/twada/growing-reliable-code-phperkaigi-2022

https://speakerdeck.com/kazatohiei/phperkaigi2022?slide=33

https://zenn.dev/ysit/articles/github-actions-test-summary

やり方

ワークフローを定義します

カバレッジを全て表示すると見づらいので必要な箇所だけを切り取りしてPRコメントに出力するようにします

スクリーンショット 2022-04-13 1.05.05.png

ブラウザ上でカバレッジを見たい場合

出力形式はいくつかあるので公式を参考に設定ください

https://phpunit.readthedocs.io/ja/latest/textui.html#textui-clioptions

HTML形式で出力したい場合は以下のコマンドをLaravelコンテナ内で実行してください

phpdbg -qrr ./vendor/bin/phpunit --coverage-html ./coverage

解説

MySQLコンテナ起動後、実行するまでに時間を要しますがテストが先に開始されるとConnection Refusedで接続ができません。

今回は3分弱時間を置いてからテストプロセスに進めるように設定しました

https://stackoverflow.com/questions/62446815/docker-mysql-github-actions-connection-refused

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 }}
GitHubで編集を提案

Discussion