LoginSignup
18
11

More than 1 year has passed since last update.

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

Posted at

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

image.png

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

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

用意するもの

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

Coverallsと対象のレポジトリを接続する

image.png

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

PHPUnitの設定を変更する

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

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の設定を仕込んでおく

.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

[GitHub]secrets.GITHUB_TOKENで実行できる権限について簡単ながらマッピングしてみた | DevelopersIO

完成したバッジを貼り付ける

image.png

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

18
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
11