diff --git a/.github/workflows/coding-standards.yml b/.github/workflows/coding-standards.yml new file mode 100644 index 0000000..56e4c96 --- /dev/null +++ b/.github/workflows/coding-standards.yml @@ -0,0 +1,82 @@ +name: Coding Standards + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + paths: + # Any change to a PHP or JavaScript file should run checks. + - '**.js' + - '**.php' + # These files configure npm. Changes could affect the outcome. + - 'package*.json' + # These files configure Composer. Changes could affect the outcome. + - 'composer.*' + # This file configures ESLint. Changes could affect the outcome. + - '.eslintrc.js' + # This file configures PHPCS. Changes could affect the outcome. + - 'phpcs.xml.dist' + # Changes to workflow files should always verify all workflows are successful. + - '.github/workflows/*.yml' + +# Cancels all previous workflow runs for pull requests that have not completed. +concurrency: + # The concurrency group contains the workflow name and the branch name for pull requests + # or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} + cancel-in-progress: true + +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + +jobs: + # Runs the PHP coding standards checks. + phpcs: + name: PHP coding standards + uses: samiahmedsiddiqui/custom-permalinks/.github/workflows/reusable-coding-standards-php.yml@main + permissions: + contents: read + if: ${{ github.repository == 'samiahmedsiddiqui/custom-permalinks' || github.event_name == 'pull_request' }} + + # Runs the JavaScript coding standards checks. + eslint: + name: JavaScript coding standards + uses: samiahmedsiddiqui/custom-permalinks/.github/workflows/reusable-coding-standards-javascript.yml@main + permissions: + contents: read + if: ${{ github.repository == 'samiahmedsiddiqui/custom-permalinks' || github.event_name == 'pull_request' }} + + failed-workflow: + name: Failed workflow tasks + runs-on: ubuntu-latest + permissions: + actions: write + needs: [ phpcs, eslint ] + if: | + always() && + github.repository == 'samiahmedsiddiqui/custom-permalinks' && + github.event_name != 'pull_request' && + github.run_attempt < 2 && + ( + contains( needs.*.result, 'cancelled' ) || + contains( needs.*.result, 'failure' ) + ) + + steps: + - name: Dispatch workflow run + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + retries: 2 + retry-exempt-status-codes: 418 + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'failed-workflow.yml', + ref: 'trunk', + inputs: { + run_id: '${{ github.run_id }}' + } + }); diff --git a/.github/workflows/reusable-coding-standards-javascript.yml b/.github/workflows/reusable-coding-standards-javascript.yml new file mode 100644 index 0000000..e9c6eb7 --- /dev/null +++ b/.github/workflows/reusable-coding-standards-javascript.yml @@ -0,0 +1,46 @@ +## +# A reusable workflow that checks the JavaScript coding standards. +## +name: JavaScript coding standards + +on: + workflow_call: + +jobs: + eslint: + name: Run coding standards checks + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [18.x, 20.x, 22.x] + + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + + - name: Log debug information + run: | + npm --version + node --version + git --version + + - name: Install npm Dependencies + run: npm ci + + - name: Run ESLint + run: npm run lint:js + + - name: Ensure version-controlled files are not modified or deleted + run: git diff --exit-code diff --git a/.github/workflows/reusable-coding-standards-php.yml b/.github/workflows/reusable-coding-standards-php.yml new file mode 100644 index 0000000..0521efd --- /dev/null +++ b/.github/workflows/reusable-coding-standards-php.yml @@ -0,0 +1,49 @@ +## +# A reusable workflow that checks the PHP coding standards. +## +name: PHP coding standards + +on: + workflow_call: + inputs: + php-version: + description: 'The PHP version to use.' + required: false + type: 'string' + default: 'latest' + +jobs: + phpcs: + name: Run coding standards checks + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} + + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ inputs.php-version }} + tools: cs2pr + + - name: Install Composer dependencies + run: composer install + + - name: Make Composer packages available globally + run: echo "${PWD}/vendor/bin" >> $GITHUB_PATH + + - name: Run PHPCS on all files + id: phpcs + run: phpcs -n --report-full --cache=./.cache/phpcs-src.json --report-checkstyle=./.cache/phpcs-report.xml + + - name: Show PHPCS results in PR + if: ${{ always() && steps.phpcs.outcome == 'failure' }} + run: cs2pr ./.cache/phpcs-report.xml + + - name: Ensure version-controlled files are not modified or deleted + run: git diff --exit-code diff --git a/.github/workflows/wpcs-php.yml b/.github/workflows/wpcs-php.yml deleted file mode 100644 index 9fd6403..0000000 --- a/.github/workflows/wpcs-php.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: WordPress Coding Standards (PHP) - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install dependencies - run: composer install - - - name: Test WPCS - run: composer lint