Merge branch '3.x' into 4.x #71
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Test requirements check | |
on: | |
# Run on pushes to the main branches and on pull requests which touch files related to the requirements check. | |
# No need to run this workflow when there are only irrelevant changes. | |
push: | |
branches: | |
- 4.x | |
tags: | |
- '**' | |
paths: | |
- '.github/workflows/test-requirements-check.yml' | |
- '.github/workflows/reusable-build-phar.yml' | |
- 'bin/phpcs' | |
- 'bin/phpcbf' | |
- 'phpcs.xml.dist' | |
- 'requirements.php' | |
- 'scripts/**' | |
pull_request: | |
paths: | |
- '.github/workflows/test-requirements-check.yml' | |
- '.github/workflows/reusable-build-phar.yml' | |
- 'bin/phpcs' | |
- 'bin/phpcbf' | |
- 'phpcs.xml.dist' | |
- 'requirements.php' | |
- 'scripts/**' | |
# Allow manually triggering the workflow. | |
workflow_dispatch: | |
# Cancels all previous workflow runs for the same branch that have not yet completed. | |
concurrency: | |
# The concurrency group contains the workflow name and the branch name. | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
jobs: | |
# Make sure that the files involved in the requirements check don't contain parse errors | |
# for the PHP versions supported by the requirements check to prevent the tests being run | |
# failing on the parse errors instead of on the requirements check | |
# (which would easily go unnoticed). | |
lint: | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
php: ['5.3', '5.4', '5.5', '5.6', '7.0', '7.1'] | |
name: "Lint: PHP ${{ matrix.php }}" | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
- name: Install PHP | |
uses: shivammathur/setup-php@bf6b4fbd49ca58e4608c9c89fba0b8d90bd2a39f # 2.35.5 | |
with: | |
php-version: ${{ matrix.php }} | |
coverage: none | |
- name: "Lint bin/phpcs" | |
run: php -l ./bin/phpcs | |
- name: "Lint bin/phpcbf" | |
run: php -l ./bin/phpcbf | |
- name: "Lint requirements.php" | |
run: php -l ./requirements.php | |
# The matrix for these tests should be the same for the "plain" file test as for the PHAR test. | |
# This matrix, however, is quite complex, making maintaining it manually pretty error prone. | |
# So this job uses a PHP script to generate the matrix based on a fixed set of variables. | |
# | |
# The resulting matrix contains builds which combine the following variables: | |
# - os: ubuntu / windows | |
# - cmd: phpcs / phpcbf | |
# - php: 7.2 (minimum PHP version for 4.x), latest and nightly with the required extensions (should pass the check). | |
# - php: 5.3 (minimum for the requirements check) and 7.1 with the required extension (should fail the PHP version check). | |
# - php: 7.2 (minimum PHP version for 4.x), latest and nightly WITHOUT required extensions (should fail the check for extensions). | |
# | |
# Each combination also contains a "expect" key to set the expectations for success / failure. | |
# | |
# The scripts involved in generating the matrix can be found in the `/scripts/` directory. | |
prepare-matrix: | |
needs: lint | |
name: Get test matrix | |
runs-on: ubuntu-latest | |
outputs: | |
matrix: ${{ steps.set-matrix.outputs.MATRIX }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
- name: Install PHP | |
uses: shivammathur/setup-php@bf6b4fbd49ca58e4608c9c89fba0b8d90bd2a39f # 2.35.5 | |
with: | |
php-version: 'latest' | |
ini-values: 'error_reporting=-1, display_errors=On, display_startup_errors=On' | |
coverage: none | |
- name: Set matrix | |
id: set-matrix | |
run: echo "MATRIX=$(php scripts/get-requirements-check-matrix.php)" >> "$GITHUB_OUTPUT" | |
- name: "DEBUG: show generated matrix" | |
run: echo ${{ steps.set-matrix.outputs.MATRIX }} | |
# Test that the requirements check works correctly when using a Composer install or git clone of PHPCS. | |
test-plain: | |
needs: prepare-matrix | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJson(needs.prepare-matrix.outputs.MATRIX) }} | |
# yamllint disable-line rule:line-length | |
name: "Plain: ${{ matrix.cmd == 'phpcs' && 'cs' || 'cbf' }} / ${{ matrix.php }} / ${{ matrix.name }} (${{ matrix.os == 'ubuntu-latest' && 'nix' || 'Win' }})" | |
continue-on-error: ${{ matrix.php == 'nightly' }} | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
- name: Install PHP | |
uses: shivammathur/setup-php@bf6b4fbd49ca58e4608c9c89fba0b8d90bd2a39f # 2.35.5 | |
with: | |
php-version: ${{ matrix.php }} | |
ini-values: 'error_reporting=-1, display_errors=On, display_startup_errors=On' | |
extensions: ${{ matrix.extensions }} | |
coverage: none | |
env: | |
fail-fast: true | |
# We're only testing the requirements check here, so we just need to verify that PHPCS/PHPCBF starts. Nothing more. | |
- name: Run the test | |
id: check | |
continue-on-error: true | |
shell: bash | |
run: | | |
set +e | |
php "bin/${{ matrix.cmd }}" --version | |
exitcode="$?" | |
echo "EXITCODE=$exitcode" >> "$GITHUB_OUTPUT" | |
echo "Exitcode is: $exitcode" | |
exit "$exitcode" | |
- name: Check the result of a successful test against expectation | |
if: ${{ steps.check.outcome == 'success' && matrix.expect == 'fail' }} | |
run: exit 1 | |
- name: Check the result of a failed test against expectation | |
if: ${{ steps.check.outcome != 'success' && matrix.expect == 'success' }} | |
run: exit 1 | |
- name: Verify the exit code is 0 when requirements are met | |
if: ${{ matrix.expect == 'success' && steps.check.outputs.EXITCODE != 0 }} | |
run: exit 1 | |
- name: Verify the exit code is 64 when requirements are not met | |
if: ${{ matrix.expect == 'fail' && steps.check.outputs.EXITCODE != 64 }} | |
run: exit 1 | |
build-phars: | |
needs: lint | |
name: "Build Phar on PHP 8.0" | |
uses: ./.github/workflows/reusable-build-phar.yml | |
with: | |
uploadArtifacts: true | |
# Test that the requirements check works correctly when using a PHPCS/PHPCBF PHAR file. | |
test-phar: | |
needs: [prepare-matrix, build-phars] | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJson(needs.prepare-matrix.outputs.MATRIX) }} | |
# yamllint disable-line rule:line-length | |
name: "PHAR: ${{ matrix.cmd == 'phpcs' && 'cs' || 'cbf' }} / ${{ matrix.php }} / ${{ matrix.name }} (${{ matrix.os == 'ubuntu-latest' && 'nix' || 'Win' }})" | |
continue-on-error: ${{ matrix.php == 'nightly' }} | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
- name: Install PHP | |
uses: shivammathur/setup-php@bf6b4fbd49ca58e4608c9c89fba0b8d90bd2a39f # 2.35.5 | |
with: | |
php-version: ${{ matrix.php }} | |
ini-values: 'error_reporting=-1, display_errors=On, display_startup_errors=On' | |
extensions: ${{ matrix.extensions }} | |
coverage: none | |
env: | |
fail-fast: true | |
- name: Download the phar | |
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 | |
with: | |
name: ${{ matrix.cmd }}-phar | |
# We're only testing the requirements check here, so we just need to verify that PHPCS/PHPCBF starts. Nothing more. | |
- name: Run the test | |
id: check | |
continue-on-error: true | |
shell: bash | |
run: | | |
set +e | |
php ${{ matrix.cmd }}.phar --version | |
exitcode="$?" | |
echo "EXITCODE=$exitcode" >> "$GITHUB_OUTPUT" | |
echo "Exitcode is: $exitcode" | |
exit "$exitcode" | |
- name: Check the result of a successful test against expectation | |
if: ${{ steps.check.outcome == 'success' && matrix.expect == 'fail' }} | |
run: exit 1 | |
- name: Check the result of a failed test against expectation | |
if: ${{ steps.check.outcome != 'success' && matrix.expect == 'success' }} | |
run: exit 1 | |
- name: Verify the exit code is 0 when requirements are met | |
if: ${{ matrix.expect == 'success' && steps.check.outputs.EXITCODE != 0 }} | |
run: exit 1 | |
- name: Verify the exit code is 64 when requirements are not met | |
if: ${{ matrix.expect == 'fail' && steps.check.outputs.EXITCODE != 64 }} | |
run: exit 1 |