name: "M2 Coding Standard" author: "Mage-OS" description: "A Github Action that runs the Magento Coding Standard." inputs: php_version: type: string required: true default: "8.2" description: "PHP version used to do the coding standard check (default: 8.2)." composer_version: type: string required: true default: "2" description: "The version of composer to use (default: 2)." version: type: string required: false default: "*" description: "The version of the coding standard to use (default: latest)." severity: type: string required: false default: "5" description: "The minimum severity required to display an error or warning (default: 5)" warning_severity: type: string required: false default: "8" description: "The minimum severity required to display a warning (default: 8)." error_severity: type: string required: false default: "8" description: "The minimum severity required to display an error (default: 8)." baseline_version: type: string required: false default: "*" description: "The version of phpcs baseline to use (default: latest)." runs: using: composite steps: - name: Checkout head uses: actions/checkout@v4 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} - name: Get all changed files uses: tj-actions/changed-files@v39 id: changed-files-phpcs with: files_yaml: | app: - '**/*.php' - '**/*.phtml' - '**/*.graphqls' - '**/*.less' - '**/*.css' - '**/*.html' - '**/*.xml' - '**/*.js' - name: Inform if no files have changed if: steps.changed-files-phpcs.outputs.app_any_changed == 'false' shell: bash run: | echo "No files relevant to PHPCS have changed. Skipping PHPCS run." echo "List all the files that have changed: ${{ steps.changed-files-phpcs.outputs.app_all_changed_files }}" - name: Inform if relevant files have changed if: steps.changed-files-phpcs.outputs.app_any_changed == 'true' shell: bash run: | echo "One or more files relevant to PHPCS have changed." echo "List all the files that have changed: ${{ steps.changed-files-phpcs.outputs.app_all_changed_files }}" - name: Setup PHP if: steps.changed-files-phpcs.outputs.app_any_changed == 'true' uses: shivammathur/setup-php@v2 with: php-version: ${{ inputs.php_version }} tools: composer:v${{ inputs.composer_version }} coverage: none - name: Create composer project if: steps.changed-files-phpcs.outputs.app_any_changed == 'true' shell: bash run: | composer create-project --no-plugins --no-dev \ magento/magento-coding-standard \ magento-coding-standard "${{ github.event.inputs.version || '*' }}" - name: Register coding standards if: steps.changed-files-phpcs.outputs.app_any_changed == 'true' working-directory: magento-coding-standard shell: bash run: | composer config --no-plugins allow-plugins.digitalrevolution/php-codesniffer-baseline true composer require --dev "digitalrevolution/php-codesniffer-baseline: ${{ github.event.inputs.baseline_version || '*' }}" - name: Checkout base to generate baseline if: steps.changed-files-phpcs.outputs.app_any_changed == 'true' uses: actions/checkout@v4 with: ref: ${{github.event.pull_request.base.ref}} repository: ${{github.event.pull_request.base.repo.full_name}} path: base - name: Create phpcs.baseline.xml from base shell: bash working-directory: base if: steps.changed-files-phpcs.outputs.app_any_changed == 'true' run: | php ${{ github.workspace }}/magento-coding-standard/vendor/bin/phpcs --standard=Magento2 \ $([ -n "${{ inputs.severity }}" ] && echo "--severity=${{ inputs.severity }}") \ $([ -n "${{ inputs.warning_severity }}" ] && echo "--warning-severity=${{ inputs.warning_severity }}") \ $([ -n "${{ inputs.error_severity }}" ] && echo "--error-severity=${{ inputs.error_severity }}") \ --report=\\DR\\CodeSnifferBaseline\\Reports\\Baseline --report-file=phpcs.baseline.xml \ ${{ steps.changed-files-phpcs.outputs.app_all_changed_files }} || /bin/true - name: Copy baseline to head if: steps.changed-files-phpcs.outputs.app_any_changed == 'true' shell: bash run: | cp ${{ github.workspace }}/base/phpcs.baseline.xml ${{ github.workspace }}/magento-coding-standard/phpcs.baseline.xml # Since we ran phpcs in the base folder, the files in phpcs.baseline.xml contain the base folder in the path. # We need to remove /base/ so that the phpcs can locate the correct files. - name: Remove base dir from phpcs baseline if: steps.changed-files-phpcs.outputs.app_any_changed == 'true' shell: bash run: | sed -i "s|/base/|/|" ${{ github.workspace }}/magento-coding-standard/phpcs.baseline.xml - name: Execute phpcs on head for changed files shell: bash if: steps.changed-files-phpcs.outputs.app_any_changed == 'true' run: | php ${{ github.workspace }}/magento-coding-standard/vendor/bin/phpcs --standard=Magento2 \ $([ -n "${{ inputs.severity }}" ] && echo "--severity=${{ inputs.severity }}") \ $([ -n "${{ inputs.warning_severity }}" ] && echo "--warning-severity=${{ inputs.warning_severity }}") \ $([ -n "${{ inputs.error_severity }}" ] && echo "--error-severity=${{ inputs.error_severity }}") \ ${{ steps.changed-files-phpcs.outputs.app_all_changed_files }}