.github/workflows/continuous-integration.yml
# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
# file-version: 1.0
name: "Continuous Integration"
on:
- pull_request
- push
permissions:
contents: read
concurrency:
group: "${{ github.event_name }}-${{ github.workflow }}-${{ github.head_ref || github.run_id }}-${{ github.ref }}"
cancel-in-progress: true
jobs:
validate:
name: "Validate Project"
uses: "mimmi20/ci/.github/workflows/validate.yml@8.1"
with:
extensions: "ctype, curl, dom, iconv, intl, mbstring, simplexml, tokenizer, xml, xmlwriter"
ini-values: "opcache.enable=1, opcache.fast_shutdown=0, zend.assertions=1, assert.exception=On, intl.default_locale=de, intl.use_exceptions=1, zend.exception_ignore_args=0"
composer-options: "--optimize-autoloader --prefer-dist --prefer-stable -v"
skip-validate-composer: false
skip-validate-yaml: false
skip-validate-md: false
skip-phplint: false
skip-check-composer: false
skip-ec-checker: false
dependency-analyser-options: "--ignore-dev-in-prod-deps"
install:
name: "Install Project"
needs: "validate"
uses: "mimmi20/ci/.github/workflows/install.yml@8.1"
with:
extensions: "ctype, curl, dom, iconv, intl, mbstring, simplexml, tokenizer, xml, xmlwriter"
ini-values: "opcache.enable=1, opcache.fast_shutdown=0, zend.assertions=1, assert.exception=On, intl.default_locale=de, intl.use_exceptions=1, zend.exception_ignore_args=0"
composer-options: "--optimize-autoloader --prefer-dist --prefer-stable -v"
skip-php-install: false
skip-npm-install: true
analytics:
name: "Project Analysis"
needs: "install"
uses: "mimmi20/ci/.github/workflows/analytics.yml@8.1"
with:
extensions: "ctype, curl, dom, iconv, intl, mbstring, simplexml, tokenizer, xml, xmlwriter"
ini-values: "opcache.enable=1, opcache.fast_shutdown=0, zend.assertions=1, assert.exception=On, intl.default_locale=de, intl.use_exceptions=1, zend.exception_ignore_args=0"
composer-options: "--optimize-autoloader --prefer-dist --prefer-stable -v"
skip-phpstan: false
skip-rector: false
skip-phpmd: false
skip-eslint: true
skip-stylelint: true
skip-prettier: true
phpcs-options: ""
tests:
name: "UnitTests with PHPUnit"
needs: "analytics"
runs-on: "${{ matrix.operating-system }}"
timeout-minutes: 10
continue-on-error: false
strategy:
fail-fast: false
matrix:
operating-system:
- "ubuntu-22.04"
- "ubuntu-24.04"
php-version:
- "8.1"
- "8.2"
- "8.3"
dependencies:
- "lowest"
steps:
- name: "Checkout"
uses: "actions/checkout@v4"
with:
# Disabling shallow clone is recommended for improving relevancy of reporting
fetch-depth: 0
lfs: false
persist-credentials: false
- name: "Install PHP"
uses: "shivammathur/setup-php@2.31.1"
with:
php-version: "${{ matrix.php-version }}"
extensions: "none, phar, json, opcache, ctype, curl, dom, iconv, intl, mbstring, simplexml, tokenizer, xml, xmlwriter"
ini-values: "opcache.enable=1, opcache.fast_shutdown=0, zend.assertions=1, assert.exception=On, intl.default_locale=de, intl.use_exceptions=1, zend.exception_ignore_args=0"
coverage: "none"
tools: "composer:v2"
env:
fail-fast: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
phpts: "nts"
debug: true
- name: "Update dependencies with composer"
uses: "ramsey/composer-install@3.0.0"
with:
dependency-versions: "${{ matrix.dependencies }}"
composer-options: "--optimize-autoloader --prefer-dist --prefer-stable -v"
- name: "Run unit tests with phpunit/phpunit"
run: "vendor/bin/phpunit -c phpunit.xml --no-coverage --display-warnings --display-deprecations"
- name: "Enable annotations for validation errors and warnings"
uses: "korelstar/xmllint-problem-matcher@v1"
- name: "Validate phpcs.xml"
uses: "ChristophWurst/xmllint-action@v1"
with:
xml-file: "phpunit.xml"
xml-schema-file: "vendor/phpunit/phpunit/phpunit.xsd"
code-coverage:
name: "Code Coverage with PHPUnit"
needs: "analytics"
runs-on: "${{ matrix.operating-system }}"
timeout-minutes: 10
continue-on-error: false
strategy:
fail-fast: false
matrix:
operating-system:
- "ubuntu-22.04"
- "ubuntu-24.04"
php-version:
- "8.1"
dependencies:
- "lowest"
steps:
- name: "Checkout"
uses: "actions/checkout@v4"
with:
# Disabling shallow clone is recommended for improving relevancy of reporting
fetch-depth: 0
lfs: false
persist-credentials: false
- name: "Install PHP"
uses: "shivammathur/setup-php@2.31.1"
with:
php-version: "${{ matrix.php-version }}"
extensions: "none, phar, json, opcache, ctype, curl, dom, iconv, intl, mbstring, simplexml, tokenizer, xml, xmlwriter"
ini-values: "opcache.enable=1, opcache.fast_shutdown=0, zend.assertions=1, assert.exception=On, intl.default_locale=de, intl.use_exceptions=1, zend.exception_ignore_args=0, xdebug.mode=coverage"
coverage: "xdebug"
tools: "composer:v2"
env:
fail-fast: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
phpts: "nts"
debug: true
- name: "Update dependencies with composer"
uses: "ramsey/composer-install@3.0.0"
with:
dependency-versions: "${{ matrix.dependencies }}"
composer-options: "--optimize-autoloader --prefer-dist --prefer-stable -v"
- name: "Create cache directory for phpunit/phpunit"
run: "mkdir -p .build/coverage"
- name: "Collect code coverage with Xdebug and phpunit/phpunit"
run: "vendor/bin/phpunit -c phpunit.xml --coverage-clover=.build/coverage/clover.xml --coverage-text --coverage-xml=.build/coverage/coverage-xml --log-junit=.build/coverage/phpunit.junit.xml --display-warnings --display-deprecations"
- name: "Upload coverage to Codecov"
uses: "codecov/codecov-action@v4.6.0"
with:
file: ".build/coverage/clover.xml"
flags: "phpunit,php-${{ matrix.php-version }},${{ matrix.operating-system }}"
verbose: false
env:
CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}"
- name: "Upload coverage to Codeclimate"
uses: "paambaati/codeclimate-action@v9.0.0"
env:
CC_TEST_REPORTER_ID: "${{ secrets.CODECLIMATE_API_KEY }}"
with:
coverageLocations: ".build/coverage/clover.xml:clover"
debug: false
- name: "Upload coverage to Coveralls"
uses: "coverallsapp/github-action@v2"
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
flag-name: "php ${{ matrix.php-version }} on ${{ matrix.operating-system }}"
parallel: true
file: ".build/coverage/clover.xml"
format: "clover"
debug: false
- name: "Run mutation tests with infection/infection"
env:
STRYKER_DASHBOARD_API_KEY: ${{ secrets.STRYKER_DASHBOARD_API_KEY }}
run: "vendor/bin/infection --show-mutations --only-covered --min-covered-msi=100 --min-msi=100 --coverage=.build/coverage --logger-github --no-progress -vv"
finish-code-coverage:
runs-on: "ubuntu-24.04"
needs: "code-coverage"
if: always()
steps:
- name: "Coveralls Finished"
uses: "coverallsapp/github-action@v2"
with:
parallel-finished: true
# This is a meta job to avoid to have to constantly change the protection rules
# whenever we touch the matrix.
tests-status:
name: "Unit & Integration Tests Status"
runs-on: "ubuntu-24.04"
if: always()
needs:
- "tests"
- "code-coverage"
steps:
- name: Successful run
if: ${{ !(contains(needs.*.result, 'failure')) }}
run: exit 0
- name: Failing run
if: ${{ contains(needs.*.result, 'failure') }}
run: exit 1