Skip to content

Continuous Integration (CI) #742

Continuous Integration (CI)

Continuous Integration (CI) #742

name: Continuous Integration (CI)
on:
push:
paths-ignore:
- '.ddev/**'
- '.github/ISSUE_TEMPLATE/*'
- '.github/FUNDING.yml'
- '.vscode/*'
- '**.md'
pull_request:
paths-ignore:
- '.ddev/**'
- '.github/ISSUE_TEMPLATE/*'
- '.github/FUNDING.yml'
- '.vscode/*'
- '**.md'
schedule:
- cron: '44 4 * * *'
env:
COMPOSER_FLAGS: --ansi --no-interaction --no-progress
COMPOSER_INSTALL_FLAGS: --prefer-dist
COMPOSER_UPDATE_FLAGS: ''
GS_CI: 0
jobs:
validation:
name: Composer validation
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install PHP
uses: shivammathur/setup-php@v2
with:
coverage: none
extensions: intl, zip
ini-values: memory_limit=-1, error_reporting=E_ALL, display_errors=On
php-version: latest
tools: composer
- name: Composer Cache Vars
id: composer-cache-vars
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
echo "timestamp=$(date +"%s")" >> $GITHUB_OUTPUT
- name: Cache Composer dependencies
uses: actions/cache@v3
with:
path: ${{ steps.composer-cache-vars.outputs.dir }}
key: ${{ runner.os }}-composer-latest-${{ steps.composer-cache-vars.outputs.timestamp }}
restore-keys: |
${{ runner.os }}-composer-latest-
${{ runner.os }}-composer-
- name: Install dependencies
run: composer install ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
- name: Validate composer.json
run: vendor/bin/composer ci:composer:validate
- name: Normalize composer.json
run: vendor/bin/composer ci:composer:normalize
- name: Check dependencies
run: vendor/bin/composer ci:composer:require-checker
yaml_lint:
name: YAML Lint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install PHP
uses: shivammathur/setup-php@v2
with:
coverage: none
extensions: intl, zip
ini-values: memory_limit=-1, error_reporting=E_ALL, display_errors=On
php-version: latest
tools: composer
- name: Composer Cache Vars
id: composer-cache-vars
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
echo "timestamp=$(date +"%s")" >> $GITHUB_OUTPUT
- name: Cache Composer dependencies
uses: actions/cache@v3
with:
path: ${{ steps.composer-cache-vars.outputs.dir }}
key: ${{ runner.os }}-composer-latest-${{ steps.composer-cache-vars.outputs.timestamp }}
restore-keys: |
${{ runner.os }}-composer-latest-
${{ runner.os }}-composer-
- name: Install dependencies
run: composer install ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
- name: Lint YAML files
run: vendor/bin/composer ci:yaml:lint
php_lint:
name: PHP Lint
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental }}
strategy:
fail-fast: false
matrix:
php-version:
- '7.4'
- 'latest'
experimental:
- false
include:
- php-version: 'nightly'
experimental: true
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install PHP
uses: shivammathur/setup-php@v2
with:
coverage: none
extensions: intl, zip
ini-values: memory_limit=-1, error_reporting=E_ALL, display_errors=On
php-version: ${{ matrix.php-version }}
tools: composer
- name: Composer Cache Vars
id: composer-cache-vars
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
echo "timestamp=$(date +"%s")" >> $GITHUB_OUTPUT
- name: Cache Composer dependencies
uses: actions/cache@v3
with:
path: ${{ steps.composer-cache-vars.outputs.dir }}
key: ${{ runner.os }}-composer-${{ matrix.php-version }}-${{ steps.composer-cache-vars.outputs.timestamp }}
restore-keys: |
${{ runner.os }}-composer-${{ matrix.php-version }}-
${{ runner.os }}-composer-
- name: Set platform.php for nightly
if: ${{ matrix.php-version == 'nightly' }}
run: |
composer install --no-scripts ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
composer bin phpunit config platform.php 8.1.99
- name: Install dependencies
run: composer update ${{ env.COMPOSER_UPDATE_FLAGS }} ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
- name: Lint PHP files
run: composer ci:php:lint
php_rector:
name: PHP Rector
needs:
- php_lint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install PHP
uses: shivammathur/setup-php@v2
with:
coverage: none
extensions: intl, zip
ini-values: memory_limit=-1, error_reporting=E_ALL, display_errors=On
php-version: latest
tools: composer
- name: Composer Cache Vars
id: composer-cache-vars
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
echo "timestamp=$(date +"%s")" >> $GITHUB_OUTPUT
- name: Cache Composer dependencies
uses: actions/cache@v3
with:
path: ${{ steps.composer-cache-vars.outputs.dir }}
key: ${{ runner.os }}-composer-latest-${{ steps.composer-cache-vars.outputs.timestamp }}
restore-keys: |
${{ runner.os }}-composer-latest-
${{ runner.os }}-composer-
- name: Install dependencies
run: composer install ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
- name: Validation of Rector rules for PHP files
run: composer ci:php:rector
php_coding_standards:
name: PHP Coding Standards
needs:
- php_rector
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install PHP
uses: shivammathur/setup-php@v2
with:
coverage: none
extensions: intl, zip
ini-values: memory_limit=-1, error_reporting=E_ALL, display_errors=On
php-version: latest
tools: composer
- name: Composer Cache Vars
id: composer-cache-vars
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
echo "timestamp=$(date +"%s")" >> $GITHUB_OUTPUT
- name: Cache Composer dependencies
uses: actions/cache@v3
with:
path: ${{ steps.composer-cache-vars.outputs.dir }}
key: ${{ runner.os }}-composer-latest-${{ steps.composer-cache-vars.outputs.timestamp }}
restore-keys: |
${{ runner.os }}-composer-latest-
${{ runner.os }}-composer-
- name: Install dependencies
run: composer install ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
- name: Validation of coding standards for PHP files
run: composer ci:php:cs-fixer
php_sniff:
name: PHP Code Sniffer
needs:
- php_rector
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install PHP
uses: shivammathur/setup-php@v2
with:
coverage: none
extensions: intl, zip
ini-values: memory_limit=-1, error_reporting=E_ALL, display_errors=On
php-version: latest
tools: composer
- name: Composer Cache Vars
id: composer-cache-vars
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
echo "timestamp=$(date +"%s")" >> $GITHUB_OUTPUT
- name: Cache Composer dependencies
uses: actions/cache@v3
with:
path: ${{ steps.composer-cache-vars.outputs.dir }}
key: ${{ runner.os }}-composer-latest-${{ steps.composer-cache-vars.outputs.timestamp }}
restore-keys: |
${{ runner.os }}-composer-latest-
${{ runner.os }}-composer-
- name: Install dependencies
run: composer install ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
- name: Validation of coding standards
run: composer ci:php:sniff
php_copypaste_detector:
name: PHP Copy/Paste Detector
needs:
- php_rector
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install PHP
uses: shivammathur/setup-php@v2
with:
coverage: none
extensions: intl, zip
ini-values: memory_limit=-1, error_reporting=E_ALL, display_errors=On
php-version: latest
tools: composer
- name: Composer Cache Vars
id: composer-cache-vars
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
echo "timestamp=$(date +"%s")" >> $GITHUB_OUTPUT
- name: Cache Composer dependencies
uses: actions/cache@v3
with:
path: ${{ steps.composer-cache-vars.outputs.dir }}
key: ${{ runner.os }}-composer-latest-${{ steps.composer-cache-vars.outputs.timestamp }}
restore-keys: |
${{ runner.os }}-composer-latest-
${{ runner.os }}-composer-
- name: Install dependencies
run: composer install ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
- name: Detection of copy/paste code in PHP files
run: composer ci:php:copypaste
php_stan:
name: PHP Stan
needs:
- validation
- php_coding_standards
- php_sniff
- php_copypaste_detector
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental }}
strategy:
fail-fast: false
matrix:
php-version:
- '7.4'
- 'latest'
dependencies:
- 'lowest'
- 'stable'
- 'highest'
experimental:
- false
include:
- php-version: 'nightly'
dependencies: 'lowest'
experimental: true
- php-version: 'nightly'
dependencies: 'stable'
experimental: true
- php-version: 'nightly'
dependencies: 'highest'
experimental: true
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install PHP
uses: shivammathur/setup-php@v2
with:
coverage: none
extensions: intl, zip
ini-values: memory_limit=-1
php-version: ${{ matrix.php-version }}
tools: composer
- name: Composer Cache Vars
id: composer-cache-vars
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
echo "timestamp=$(date +"%s")" >> $GITHUB_OUTPUT
- name: Cache Composer dependencies
uses: actions/cache@v3
with:
path: ${{ steps.composer-cache-vars.outputs.dir }}
key: ${{ runner.os }}-composer-${{ matrix.php-version }}-${{ matrix.dependencies }}-${{ steps.composer-cache-vars.outputs.timestamp }}
restore-keys: |
${{ runner.os }}-composer-${{ matrix.php-version }}-${{ matrix.dependencies }}-
${{ runner.os }}-composer-${{ matrix.php-version }}-
${{ runner.os }}-composer-
- name: Handle lowest dependencies update
if: contains(matrix.dependencies, 'lowest')
run: echo "COMPOSER_UPDATE_FLAGS=$COMPOSER_UPDATE_FLAGS --prefer-lowest" >> $GITHUB_ENV
- name: Allow alpha releases for latest-deps builds to catch problems earlier
if: contains(matrix.dependencies, 'highest')
run: composer config minimum-stability alpha
- name: Install dependencies without deprecation rules
run: composer install --no-scripts ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
- name: Set platform.php for nightly
if: ${{ matrix.php-version == 'nightly' }}
run: composer bin phpunit config platform.php 8.1.99
- name: Install dependencies without deprecation rules
run: |
composer bin phpstan -- remove --no-update ${{ env.COMPOSER_FLAGS }} phpstan/phpstan-deprecation-rules
composer update ${{ env.COMPOSER_UPDATE_FLAGS }} ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
- name: Run PHPStan
run: composer ci:php:stan
- name: Install dependencies with deprecation rules
run: |
composer bin phpstan require --no-update ${{ env.COMPOSER_FLAGS }} phpstan/phpstan-deprecation-rules:*
composer update ${{ env.COMPOSER_UPDATE_FLAGS }} ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
- name: Run PHPStan with deprecation rules
continue-on-error: true
run: composer ci:php:stan
tests:
name: Tests
needs:
- php_stan
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.experimental }}
strategy:
fail-fast: false
matrix:
os:
- ubuntu-latest
php-version:
- '7.4'
- 'latest'
dependencies:
- 'lowest'
- 'stable'
- 'highest'
experimental:
- false
include:
- os: ubuntu-latest
php-version: 'nightly'
dependencies: 'lowest'
experimental: true
- os: ubuntu-latest
php-version: 'nightly'
dependencies: 'stable'
experimental: true
- os: ubuntu-latest
php-version: 'nightly'
dependencies: 'highest'
experimental: true
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
coverage: xdebug
extensions: intl, zip
ini-values: memory_limit=-1, error_reporting=E_ALL, display_errors=On, xdebug.mode="develop,coverage"
php-version: ${{ matrix.php-version }}
tools: composer
- name: Composer Cache Vars
id: composer-cache-vars
run: |
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
echo "timestamp=$(date +"%s")" >> $GITHUB_OUTPUT
- name: Cache Composer dependencies
uses: actions/cache@v3
with:
path: ${{ steps.composer-cache-vars.outputs.dir }}
key: ${{ runner.os }}-composer-${{ matrix.php-version }}-${{ matrix.dependencies }}-${{ steps.composer-cache-vars.outputs.timestamp }}
restore-keys: |
${{ runner.os }}-composer-${{ matrix.php-version }}-${{ matrix.dependencies }}-
${{ runner.os }}-composer-${{ matrix.php-version }}-
${{ runner.os }}-composer-
- name: Handle lowest dependencies update
if: contains(matrix.dependencies, 'lowest')
run: echo "COMPOSER_UPDATE_FLAGS=$COMPOSER_UPDATE_FLAGS --prefer-lowest" >> $GITHUB_ENV
- name: Allow alpha releases for highest-deps builds to catch problems earlier
if: contains(matrix.dependencies, 'highest')
run: composer config minimum-stability alpha
- name: Enforce Composer 2.1 for PHP 8
if: ${{ matrix.php-version != '7.4' }}
run: |
composer require ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }} --dev --no-update composer/composer ^2.1
composer require ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }} -dtests/project --dev --no-update composer/composer ^2.1
- name: Set platform.php for nightly
if: ${{ matrix.php-version == 'nightly' }}
run: |
composer install --no-scripts ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
composer bin phpunit config platform.php 8.1.99
- name: Install dependencies
run: composer update ${{ env.COMPOSER_UPDATE_FLAGS }} ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }}
- name: Unit Tests
run: composer ci:tests:unit
- name: Functional Tests
run: composer ci:tests:functional
- name: Smoke Tests
run: vendor/bin/composer ci:tests:smoke
- name: Upload coverage results to Coveralls
env:
COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COVERALLS_PARALLEL: true
COVERALLS_FLAG_NAME: php-${{ matrix.php-version }}-${{ matrix.dependencies }}
run: |
composer exec phpcov -- merge --clover var/log/clover.xml var/log/cov
composer global require ${{ env.COMPOSER_INSTALL_FLAGS }} ${{ env.COMPOSER_FLAGS }} php-coveralls/php-coveralls
composer global exec php-coveralls -- --coverage_clover=var/log/clover.xml -vvv --json_path=var/log/coveralls-upload.json
- name: Archive Logs
uses: actions/upload-artifact@v3
if: always()
with:
name: logs-${{ matrix.php-version }}-${{ matrix.dependencies }}
path: var/log
if-no-files-found: ignore
retention-days: 5
coveralls-finish:
name: Finish Coveralls
needs:
- tests
runs-on: ubuntu-latest
steps:
- name: Coveralls Finished
uses: coverallsapp/github-action@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
parallel-finished: true