PHPUnitとGitHub ActionsとCoverallsを繋げて自動的に更新されるカバレッジのバッジを生成する

GitHubを見ているとREADMEにコードのカバレッジが書かれたバッジが貼ってあるのをよく見ますが、アレを実際に自分が作っているPHPのライブラリのレポジトリに貼ってみたのでその方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41743/ddd0bbb6-6840-6a8a-0a38-974dc621abdb.png)

今回はCoverallsというテストのカバレッジの結果を収集してくれるサービスを利用してバッジを作りました。

また、手作業でカバレッジのレポートを上げるのは効率が悪いので、GitHub Actionsを用いてコードが変更されると自動で上げるようにしました。

## 用意するもの
- GitHub Actionsの設定
    - テストを実行してカバレッジレポートを送信するのに必要です
- Coverallsのアカウント
    - あらかじめGitHubと連携しておいてください
- テストされるコードとテストコード

## Coverallsと対象のレポジトリを接続する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41743/27907557-1080-e779-3fdd-a52b8d68d5c4.png)

Add Reposから対象のレポジトリを接続しておきましょう。トグルをONにしておけば完了です。

## PHPUnitの設定を変更する
今回はPHPのプロジェクトを対象に設定するので、PHPUnitの設定にカバレッジ周りの設定を入れていきます。

```xml:phpunit.xml.dist
<?xml version="1.0" encoding="UTF-8"?>
<phpunit>
　　　　　　　　<!-- 以下のcoverageを追加する -->
    <coverage>
        <include>
            <directory suffix=".php">src/</directory>
        </include>
        <report>
            <clover outputFile="build/logs/clover.xml"/>
        </report>
    </coverage>
</phpunit>
```

何も設定してなければカバレッジレポートは吐き出してくれないので出力するように設定しておきます。

今回は `src/` 以下にカバレッジの計測の対象になるコードが入っている想定で、`build/logs/clover.xml`にclover形式のカバレッジレポートを出力するようにしました。

## GitHub Actionsの設定を仕込んでおく
```yaml:.github/workflows/coverage.yml
name: coverage
on:
  push:
    branches:
      # 今回はカバレッジレポートの送信の対象はmainブランチだけにしてあります(適宜変更してください)
      - main
jobs:
  phpunit:
    name: PHPUnit (PHP ${{ matrix.php-versions }} on ${{ matrix.operating-system }})
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system: [ ubuntu-latest ]
        php-versions: [ '8.1' ]
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-versions }}
          extensions: mbstring, dom, fileinfo, simplexml
          coverage: xdebug

      - name: Get composer cache directory
        id: composer-cache
        run: echo "::set-output name=dir::$(composer config cache-files-dir)"

      - name: Cache composer dependencies
        uses: actions/cache@v2
        with:
          path: ${{ steps.composer-cache.outputs.dir }}
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: ${{ runner.os }}-composer-

      - name: Install Composer dependencies
        run: composer install --no-progress --prefer-dist --optimize-autoloader

      - name: Test with PHPUnit
        run: vendor/bin/phpunit --testdox --colors=always

      - name: Upload coverage results to Coveralls
        env:
          COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          composer global require php-coveralls/php-coveralls
          php-coveralls --coverage_clover=build/logs/clover.xml -v
```

`main` ブランチに更新があったらカバレッジを計測してCoverallsに結果を送信するようにしました。

ポイントは `COVERALLS_REPO_TOKEN` ですが、何も設定しなくても `secrets.GITHUB_TOKEN` から安全に取得できるのでそれを利用しました。(ベタ書きするのは絶対にやめましょう)

`secrets.GITHUB_TOKEN` については、以下の記事が参考になるので、そちらを参照してください。

[Automatic token authentication - GitHub Docs](https://docs.github.com/ja/actions/security-guides/automatic-token-authentication)

[[GitHub]secrets.GITHUB_TOKENで実行できる権限について簡単ながらマッピングしてみた | DevelopersIO](https://dev.classmethod.jp/articles/mapping-secrets-github-token/)

## 完成したバッジを貼り付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41743/2a6dfd57-ded7-d459-8d23-fdaae559de31.png)

カバレッジレポートが上がると、Coverallsのレポジトリのページからバッジのコードが取れるようになっているので、そこからコピーしてREADMEに貼り付ければ完了です。