昨日書いた、↓ の続きです。
概要
GitHubリポジトリの特定ブランチに対するPushをトリガとして、以下の一連の作業を行うGitHubActionを実装っする
- PHPUnitによるカバレッジレポート生成
- SonarScannerでの解析と送信(カバレッジレポート含む)
前提
- https://qiita.com/gunso/items/2b26a7398148131ae4e3 が動く状態になっている
- プロジェクトに、どの環境に設置してもエラーが発生せずに正常に実行が完了するPHPUnitのテストコードが実装済みである
※DB状態、実行環境に依存するようなコードが存在している場合は、修正が必要。
前回との違い
- カバレッジレポートの生成、送信を追加
参考URL
PHP test coverage (SonarQubeドキュメント)
ワークフロー データを成果物として保存する (GitHubドキュメント)
使用制限、支払い、管理 (GitHubドキュメント)
※直接は関係無いが、お金がかかる場合があるので一応チェック
GitHub Actions の課金について (GitHubドキュメント)
※同上。
手順
GitHubが提供している、Laravelプロジェクトのテストを実行するActionのymlをコピーしてくる
URLが分からなかったが、Actionsのタブから見に行くと出てくる。Configureを押すと内容が確認できるので、リポジトリ上で確認のこと。
2023-06-28 0:02時点での内容を参考のため以下に示す。
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は以下。
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 -> チェックアウト の順序で。