Github Actionsでカバレッジレポート生成とSonarScannerを実行し、Laravelプロジェクトを解析する 

昨日書いた、↓ の続きです。

https://qiita.com/gunso/items/2b26a7398148131ae4e3 

# 概要
GitHubリポジトリの特定ブランチに対するPushをトリガとして、以下の一連の作業を行うGitHubActionを実装っする
- PHPUnitによるカバレッジレポート生成
- SonarScannerでの解析と送信（カバレッジレポート含む）

## 前提
- https://qiita.com/gunso/items/2b26a7398148131ae4e3 が動く状態になっている
- プロジェクトに、どの環境に設置してもエラーが発生せずに正常に実行が完了するPHPUnitのテストコードが実装済みである

※DB状態、実行環境に依存するようなコードが存在している場合は、修正が必要。

## 前回との違い
- カバレッジレポートの生成、送信を追加

## 参考URL
### PHP test coverage (SonarQubeドキュメント)
https://docs.sonarqube.org/latest/analyzing-source-code/test-coverage/php-test-coverage/

### ワークフロー データを成果物として保存する (GitHubドキュメント)
https://docs.github.com/ja/actions/using-workflows/storing-workflow-data-as-artifacts

### 使用制限、支払い、管理 (GitHubドキュメント)
https://docs.github.com/ja/actions/learn-github-actions/usage-limits-billing-and-administration#artifact-and-log-retention-policy

※直接は関係無いが、お金がかかる場合があるので一応チェック 

### GitHub Actions の課金について (GitHubドキュメント)
https://docs.github.com/ja/billing/managing-billing-for-github-actions/about-billing-for-github-actions

※同上。

# 手順
## GitHubが提供している、Laravelプロジェクトのテストを実行するActionのymlをコピーしてくる
URLが分からなかったが、Actionsのタブから見に行くと出てくる。Configureを押すと内容が確認できるので、リポジトリ上で確認のこと。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77380/37e272b2-eae8-d77a-c3e1-f22e25fc0032.png)


2023-06-28 0:02時点での内容を参考のため以下に示す。
```laravel.yml

name: Laravel

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  laravel-tests:

    runs-on: ubuntu-latest

    steps:
    - uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
      with:
        php-version: '8.0'
    - uses: actions/checkout@v3
    - name: Copy .env
      run: php -r "file_exists('.env') || copy('.env.example', '.env');"
    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
    - name: Generate key
      run: php artisan key:generate
    - name: Directory Permissions
      run: chmod -R 777 storage bootstrap/cache
    - name: Create Database
      run: |
        mkdir -p database
        touch database/database.sqlite
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      env:
        DB_CONNECTION: sqlite
        DB_DATABASE: database/database.sqlite
      run: vendor/bin/phpunit

```

※デフォルト状態のLaravelのプロジェクトであれば、このymlを置くだけでmainブランチへのpush,PR作成時に自動的にテストが実行される。だいたい動くとは思うが、プロジェクトごとのデプロイ手順が特殊な場合などは設定の調整が必要かも。

## 前回作成したSonarQube解析を実行するworkflowとマージする
別々にworkflowを定義することも検討したが、ファイルの受け渡しがめんどくさそうだったので、1つのworkflowに統合する方針で実装することにした。

- 前項で作成したlaravel.ymlを1つめのjob
- https://qiita.com/gunso/items/2b26a7398148131ae4e3 で作成した内容を2つめのjob

として実行し、job1で生成したファイルを、job2で受け取って利用すればよい。
作成したworkflowは以下。

```sonar-qube.yml
name: Analyze by Sonner Scanner
on:
  push:
    branches:
      - develop
jobs:
  laravel-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
        with:
          php-version: '8.1'
      - uses: actions/checkout@v3
      - name: Copy .env
        run: php -r "file_exists('.env') || copy('.env.example', '.env');"
      - name: Install Dependencies
        run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
      - name: Generate key
        run: php artisan key:generate
      - name: Directory Permissions
        run: chmod -R 777 storage bootstrap/cache
      - name: Create Database
        run: |
          mkdir -p database
          touch database/database.sqlite
      - name: Execute tests (Unit and Feature tests) via PHPUnit
        env:
          DB_CONNECTION: sqlite
          DB_DATABASE: database/database.sqlite
        run: vendor/bin/phpunit --strict-coverage --coverage-clover=clover.xml
      - name: Upload Coverage Report(clover.xml)
        uses: actions/upload-artifact@v3
        with:
          name: coverage
          path: clover.xml
  sonarqube:
    needs: laravel-tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Download Coverage Report(clover.xml)
        uses: actions/download-artifact@v3
        with:
          name: coverage
      - name: SonarQube Scan
        uses: sonarsource/sonarqube-scan-action@master
        with:
          args: >
            -Dsonar.projectKey=sonar-qube-php-test
            -Dsonar.php.coverage.reportPaths=clover.xml
        env:
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
          SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
          LC_ALL: "ja_JP.UTF-8"
```

ポイントを以下に示す。
- needs: laravel-tests を定義することで、job関係に依存関係があることを定義。
- actions/upload-artifact で生成したカバレッジレポートを保存。
- actions/download-artifact で保存したカバレッジレポートをjob2側でダウンロード。
- リポジトリからチェックアウトする前にdownload-artifactすると、上書きされてカバレッジレポートが消えてしまうので、download-artifact -> チェックアウト の順序で。