Skip to content

Enhance CI with coding style and coverage jobs #662

Enhance CI with coding style and coverage jobs

Enhance CI with coding style and coverage jobs #662

Workflow file for this run

name: build
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
coding-style:
name: Coding Style
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.3
coverage: none
- name: Cache Composer packages
uses: actions/cache@v3
with:
path: vendor
key: ${{ runner.os }}-php-8.3-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-8.3-composer-
- name: Install dependencies
run: composer install --prefer-dist --no-progress
- name: Check coding style via ECS
run: vendor/bin/ecs check
static-analysis:
name: Static Analysis
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.3
coverage: none
- name: Cache Composer packages
uses: actions/cache@v3
with:
path: vendor
key: ${{ runner.os }}-php-8.3-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-8.3-composer-
- name: Install dependencies
run: composer install --prefer-dist --no-progress
- name: Run static analysis via PHPStan
run: vendor/bin/phpstan analyse src tests
tests:
name: PHP ${{ matrix.php }} / Laravel ${{ matrix.laravel }} / ${{ matrix.dependency-version }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php: [8.1, 8.2, 8.3, 8.4]
laravel: [9.*, 10.*, 11.*, 12.*]
dependency-version: [prefer-lowest, prefer-stable]
include:
# Laravel 9 supports PHP 8.1-8.2
- laravel: 9.*
testbench: ^7.0
# Laravel 10 supports PHP 8.1-8.2
- laravel: 10.*
testbench: ^8.0
# Laravel 11 supports PHP 8.2-8.3
- laravel: 11.*
testbench: ^9.0
# Laravel 12 supports PHP 8.3-8.4
- laravel: 12.*
testbench: ^10.0
exclude:
# Laravel 9: exclude PHP 8.3, 8.4
- laravel: 9.*
php: 8.3
- laravel: 9.*
php: 8.4
# Laravel 10: exclude PHP 8.3, 8.4
- laravel: 10.*
php: 8.3
- laravel: 10.*
php: 8.4
# Laravel 11: exclude PHP 8.1, 8.4
- laravel: 11.*
php: 8.1
- laravel: 11.*
php: 8.4
# Laravel 12: exclude PHP 8.1, 8.2
- laravel: 12.*
php: 8.1
- laravel: 12.*
php: 8.2
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: testbench
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
postgres:
image: postgres:14
env:
POSTGRES_USER: root
POSTGRES_PASSWORD: password
POSTGRES_DB: testbench
ports:
- 5432:5432
options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3
redis:
image: redis:7
ports:
- 6379:6379
options: --health-cmd="redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 10
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv
coverage: none
- name: Validate composer.json and composer.lock
run: composer validate --strict
- name: Cache Composer packages
uses: actions/cache@v3
with:
path: vendor
key: ${{ runner.os }}-php-${{ matrix.php }}-${{ matrix.dependency-version }}-laravel-${{ matrix.laravel }}-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-${{ matrix.php }}-${{ matrix.dependency-version }}-laravel-${{ matrix.laravel }}-
- name: Install dependencies
run: |
composer require "laravel/framework:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update --dev
composer update --${{ matrix.dependency-version }} --prefer-dist --no-progress --no-interaction --with-all-dependencies
- name: Create SQLite database
run: touch testbench.sqlite
- name: Create MySQL database
run: mysql -e 'CREATE DATABASE IF NOT EXISTS testbench' -h127.0.0.1 -uroot -ppassword -P 3306
- name: Run test suite (MySQL)
run: vendor/bin/phpunit --testdox --testsuite feature
env:
APP_KEY: base64:i3g6f+dV8FfsIkcxqd7gbiPn2oXk5r00sTmdD6V5utI=
DB_CONNECTION: mysql
DB_DATABASE: testbench
DB_HOST: 127.0.0.1
DB_PORT: 3306
DB_USERNAME: root
DB_PASSWORD: password
QUEUE_CONNECTION: redis
QUEUE_FAILED_DRIVER: "null"
REDIS_HOST: 127.0.0.1
REDIS_PASSWORD:
REDIS_PORT: 6379
- name: Run test suite (PostgreSQL)
run: vendor/bin/phpunit --testdox --testsuite feature
env:
APP_KEY: base64:i3g6f+dV8FfsIkcxqd7gbiPn2oXk5r00sTmdD6V5utI=
DB_CONNECTION: pgsql
DB_DATABASE: testbench
DB_HOST: 127.0.0.1
DB_PORT: 5432
DB_USERNAME: root
DB_PASSWORD: password
QUEUE_CONNECTION: redis
QUEUE_FAILED_DRIVER: "null"
REDIS_HOST: 127.0.0.1
REDIS_PASSWORD:
REDIS_PORT: 6379
- name: Run test suite (SQLite - all platforms)
run: vendor/bin/phpunit --testdox
env:
APP_KEY: base64:i3g6f+dV8FfsIkcxqd7gbiPn2oXk5r00sTmdD6V5utI=
DB_CONNECTION: sqlite
DB_DATABASE: testbench.sqlite
QUEUE_CONNECTION: sync
- name: Upload laravel.log if tests fail
if: failure()
uses: actions/upload-artifact@v4
with:
name: laravel-log-php-${{ matrix.php }}-laravel-${{ matrix.laravel }}-${{ matrix.dependency-version }}
path: vendor/orchestra/testbench-core/laravel/storage/logs/laravel.log
if-no-files-found: ignore
coverage:
name: Code Coverage
runs-on: ubuntu-latest
services:
redis:
image: redis:7
ports:
- 6379:6379
options: --health-cmd="redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.3
coverage: xdebug
- name: Cache Composer packages
uses: actions/cache@v3
with:
path: vendor
key: ${{ runner.os }}-php-8.3-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-8.3-composer-
- name: Install dependencies
run: composer install --prefer-dist --no-progress
- name: Create SQLite database
run: touch testbench.sqlite
- name: Run unit tests with coverage
run: vendor/bin/phpunit --testdox --coverage-clover=coverage.clover --testsuite unit
env:
APP_KEY: base64:i3g6f+dV8FfsIkcxqd7gbiPn2oXk5r00sTmdD6V5utI=
DB_CONNECTION: sqlite
DB_DATABASE: testbench.sqlite
QUEUE_CONNECTION: sync
REDIS_HOST: 127.0.0.1
REDIS_PASSWORD:
REDIS_PORT: 6379
- name: Upload coverage to Scrutinizer
run: vendor/bin/ocular code-coverage:upload --format=php-clover coverage.clover