Skip to content

CI

CI #75

Workflow file for this run

name: CI
on: [push, pull_request]
jobs:
tests:
name: PHP ${{ matrix.php }} (${{ matrix.dependencies }} deps)
runs-on: ubuntu-latest
timeout-minutes: 5
strategy:
matrix:
php: ["8.0", "8.1", "8.2"]
dependencies: ["lowest", "locked"]
env:
extensions: mbstring, pcov
ini: pcov.directory=., "pcov.exclude=\"~(vendor|tests)~\""
steps:
- name: Checkout
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # pin@v3
- name: Setup PHP cache environment
id: ext-cache
uses: shivammathur/cache-extensions@fc01a9cdc93341e96c2078d848f2e96240d83c17 # pin@v1
with:
php-version: ${{ matrix.php }}
extensions: ${{ env.extensions }}
key: php-v1
- name: Cache PHP extensions
uses: actions/cache@c3f1317a9e7b1ef106c153ac8c0f00fed3ddbc0d # pin@v3
with:
path: ${{ steps.ext-cache.outputs.dir }}
key: ${{ steps.ext-cache.outputs.key }}
restore-keys: ${{ steps.ext-cache.outputs.key }}
- name: Setup PHP environment
uses: shivammathur/setup-php@3eda58347216592f618bb1dff277810b6698e4ca # pin@v2
with:
php-version: ${{ matrix.php }}
extensions: ${{ env.extensions }}
ini-values: ${{ env.ini }}
coverage: pcov
tools: phpunit:9.5.13, psalm:4.30.0
- name: Setup problem matchers
run: |
echo "::add-matcher::${{ runner.tool_cache }}/php.json"
echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"
- name: Get Composer cache directory
id: composerCache
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache dependencies
uses: actions/cache@c3f1317a9e7b1ef106c153ac8c0f00fed3ddbc0d # pin@v3
with:
path: ${{ steps.composerCache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-${{ matrix.dependencies }}-
- name: Install dependencies
run: |
# install the lowest or highest versions based on the matrix config
command=$([ "${{ matrix.dependencies }}" == "lowest" ] && echo "update --prefer-lowest" || echo "install")
composer $command --prefer-dist
- name: Cache analysis data
id: finishPrepare
uses: actions/cache@c3f1317a9e7b1ef106c153ac8c0f00fed3ddbc0d # pin@v3
with:
path: ~/.cache/psalm
key: backend-analysis-${{ matrix.php }}-v2
- name: Run tests
if: always() && steps.finishPrepare.outcome == 'success'
run: phpunit --coverage-clover ${{ github.workspace }}/clover.xml
- name: Statically analyze using Psalm
if: always() && steps.finishPrepare.outcome == 'success'
run: psalm --output-format=github --php-version=${{ matrix.php }}
- name: Upload coverage results to Codecov
uses: codecov/codecov-action@66b3de25f6f91f65eb92c514d31d6b6f13d5ab18 # pin@v3
with:
file: ${{ github.workspace }}/clover.xml
flags: backend
env_vars: PHP
env:
PHP: ${{ matrix.php }}
analysis:
name: Analysis
runs-on: ubuntu-latest
timeout-minutes: 5
env:
php: "8.0"
extensions: mbstring
steps:
- name: Checkout
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # pin@v3
- name: Setup PHP cache environment
id: ext-cache
uses: shivammathur/cache-extensions@fc01a9cdc93341e96c2078d848f2e96240d83c17 # pin@v1
with:
php-version: ${{ env.php }}
extensions: ${{ env.extensions }}
key: php-v1
- name: Cache PHP extensions
uses: actions/cache@c3f1317a9e7b1ef106c153ac8c0f00fed3ddbc0d # pin@v3
with:
path: ${{ steps.ext-cache.outputs.dir }}
key: ${{ steps.ext-cache.outputs.key }}
restore-keys: ${{ steps.ext-cache.outputs.key }}
- name: Setup PHP environment
id: finishPrepare
uses: shivammathur/setup-php@3eda58347216592f618bb1dff277810b6698e4ca # pin@v2
with:
php-version: ${{ env.php }}
extensions: ${{ env.extensions }}
coverage: none
tools: |
composer:2.3.7, composer-normalize:2.28.0, composer-require-checker:4.0.0,
composer-unused:0.7.12, phpcpd:6.0.3, phpmd:2.12.0
- name: Validate composer.json/composer.lock
if: always() && steps.finishPrepare.outcome == 'success'
run: composer validate --strict --no-check-version --no-check-all
- name: Ensure that composer.json is normalized
if: always() && steps.finishPrepare.outcome == 'success'
run: composer-normalize --dry-run
- name: Get Composer cache directory
id: composerCache1
if: always() && steps.finishPrepare.outcome == 'success'
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache dependencies
id: composerCache2
if: always() && steps.composerCache1.outcome == 'success'
uses: actions/cache@c3f1317a9e7b1ef106c153ac8c0f00fed3ddbc0d # pin@v3
with:
path: ${{ steps.composerCache1.outputs.dir }}
key: ${{ runner.os }}-composer-locked-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-locked-
- name: Install dependencies
id: composerInstall
if: always() && steps.composerCache2.outcome == 'success'
run: composer install --prefer-dist
- name: Check for missing Composer dependencies
if: always() && steps.composerInstall.outcome == 'success'
run: composer-require-checker --config-file=${{ github.workspace }}/.composer-require-checker.json
- name: Check for unused Composer dependencies
if: always() && steps.composerInstall.outcome == 'success'
run: composer-unused --no-progress
- name: Check for duplicated code
if: always() && steps.composerInstall.outcome == 'success'
run: phpcpd --fuzzy --exclude tests --exclude vendor .
- name: Statically analyze using PHPMD
if: always() && steps.composerInstall.outcome == 'success'
run: phpmd . github phpmd.xml.dist --exclude 'tests/*,vendor/*'
coding-style:
name: Coding Style & Frontend Analysis
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # pin@v3
- name: Set up Node.js problem matchers and cache npm dependencies
uses: actions/setup-node@eeb10cff27034e7acf239c5d29f62154018672fd # pin@v3
with:
cache: 'npm'
- name: Install npm dependencies
run: npm ci
- name: Setup PHP environment
uses: shivammathur/setup-php@3eda58347216592f618bb1dff277810b6698e4ca # pin@v2
with:
coverage: none
tools: php-cs-fixer:3.8.0
- name: Cache analysis data
id: finishPrepare
uses: actions/cache@c3f1317a9e7b1ef106c153ac8c0f00fed3ddbc0d # pin@v3
with:
path: ~/.php-cs-fixer
key: coding-style
- name: Check for JavaScript coding style violations (ESLint)
if: always() && steps.finishPrepare.outcome == 'success'
# Use the --no-fix flag in push builds to get a failed CI status
run: >
npm run lint -- --max-warnings 0 --format stylish
${{ github.event_name != 'pull_request' && '--no-fix' || '' }}
- name: Create code suggestions from the coding style changes (on PR only)
if: >
always() && steps.finishPrepare.outcome == 'success' &&
github.event_name == 'pull_request'
uses: reviewdog/action-suggester@ab82daa6ea9b84fe43db7747bb10fa087f34e1ab # pin@v1
with:
tool_name: ESLint
fail_on_error: "true"
- name: Check for JavaScript coding style violations (Prettier)
if: always() && steps.finishPrepare.outcome == 'success'
# Use the --check flag in push builds to get a failed CI status
run: >
npm run format --
${{ github.event_name != 'pull_request' && '--check' || '--write' }}
- name: Create code suggestions from the coding style changes (on PR only)
if: >
always() && steps.finishPrepare.outcome == 'success' &&
github.event_name == 'pull_request'
uses: reviewdog/action-suggester@ab82daa6ea9b84fe43db7747bb10fa087f34e1ab # pin@v1
with:
tool_name: Prettier
fail_on_error: "true"
- name: Check for PHP coding style violations
if: always() && steps.finishPrepare.outcome == 'success'
env:
PHP_CS_FIXER_IGNORE_ENV: 1
# Use the --dry-run flag in push builds to get a failed CI status
run: >
php-cs-fixer fix --diff
${{ github.event_name != 'pull_request' && '--dry-run' || '' }}
- name: Create code suggestions from the coding style changes (on PR only)
if: >
always() && steps.finishPrepare.outcome == 'success' &&
github.event_name == 'pull_request'
uses: reviewdog/action-suggester@ab82daa6ea9b84fe43db7747bb10fa087f34e1ab # pin@v1
with:
tool_name: PHP-CS-Fixer
fail_on_error: "true"