diff --git a/.github/workflows/test-and-zip-default-themes.yml b/.github/workflows/test-and-zip-default-themes.yml new file mode 100644 index 0000000000..e56c999fc5 --- /dev/null +++ b/.github/workflows/test-and-zip-default-themes.yml @@ -0,0 +1,184 @@ +name: Test Default Themes & Create ZIPs + +on: + push: + branches: + - trunk + - '3.[89]' + - '[4-9].[0-9]' + paths: + # Changing the preferred version of Node.js could affect themes with build processes. + - '.nvm' + # Changes to any themes with a build script should be confirmed. + - 'src/wp-content/themes/twentynineteen/**' + - 'src/wp-content/themes/twentytwenty/**' + - 'src/wp-content/themes/twentytwentyone/**' + # Changes to this workflow file should always verify success. + - '.github/workflows/test-and-zip-default-themes.yml' + pull_request: + branches: + - trunk + - '3.[89]' + - '[4-9].[0-9]' + paths: + # Changing the preferred version of Node.js could affect themes with build processes. + - '.nvm' + # Changes to any themes with a build script should be confirmed. + - 'src/wp-content/themes/twentynineteen/**' + - 'src/wp-content/themes/twentytwenty/**' + - 'src/wp-content/themes/twentytwentyone/**' + # Changes to this workflow file should always verify success. + - '.github/workflows/test-and-zip-default-themes.yml' + workflow_dispatch: + inputs: + branch: + description: 'The branch to create ZIP files from' + required: true + type: string + default: 'trunk' + +# 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 + +jobs: + # Tests the build script for themes that have one. + # + # Performs the following steps: + # - Checks out the repository. + # - Installs Node.js (only when theme has a build process) + # - Installs npm dependencies (only when theme has a build process) + # - Runs the theme build script (only when theme has a build process) + # - Ensures version-controlled files are not modified or deleted. + test-build-scripts: + name: Test ${{ matrix.theme }} build script + runs-on: ubuntu-latest + timeout-minutes: 10 + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + strategy: + fail-fast: false + matrix: + theme: [ + 'twentytwentyone', + 'twentytwenty', + 'twentynineteen', + ] + + defaults: + run: + working-directory: src/wp-content/themes/${{ matrix.theme }} + + steps: + - name: Checkout repository + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + with: + ref: ${{ github.event_name == 'workflow_dispatch' && inputs.branch || github.ref }} + + - name: Install Node.js + uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # v3.5.1 + with: + node-version-file: '.nvmrc' + cache: npm + cache-dependency-path: src/wp-content/themes/${{ matrix.theme }}/package-lock.json + + - name: Install npm dependencies + run: npm ci + + - name: Build theme + run: npm run build + + - name: Ensure version-controlled files are not modified or deleted + run: git diff --exit-code + + # Prepares bundled themes for release. + # + # Performs the following steps: + # - Checks out the repository. + # - Creates a ZIP file of the theme for wordpress.org. + # - Uploads the ZIP file as a workflow artifact. + bundle-theme: + name: Create ${{ matrix.theme }} ZIP file + runs-on: ubuntu-latest + needs: [ test-build-scripts ] + timeout-minutes: 10 + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + strategy: + fail-fast: false + matrix: + theme: [ + 'twentytwentythree', + 'twentytwentytwo', + 'twentytwentyone', + 'twentytwenty', + 'twentynineteen', + 'twentyseventeen', + 'twentysixteen', + 'twentyfifteen', + 'twentyfourteen', + 'twentythirteen', + 'twentytwelve', + 'twentyeleven', + 'twentyten' + ] + + steps: + - name: Checkout repository + uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 + with: + ref: ${{ github.event_name == 'workflow_dispatch' && inputs.branch || github.ref }} + + - name: Create theme ZIP file + run: zip -r ${{ matrix.theme }}.zip src/wp-content/themes/${{ matrix.theme }} -x "*/node_modules/*" + + - name: Upload theme ZIP as an artifact + uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # v3.1.1 + with: + name: ${{ matrix.theme }} + path: ${{ matrix.theme }}.zip + + slack-notifications: + name: Slack Notifications + uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk + needs: [ bundle-theme, test-build-scripts ] + if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }} + with: + calling_status: ${{ needs.test-build-scripts.result == 'success' && needs.bundle-theme.result == 'success' && 'success' || ( needs.test-build-scripts.result == 'cancelled' || needs.bundle-theme.result == 'cancelled' ) && 'cancelled' || 'failure' }} + secrets: + SLACK_GHA_SUCCESS_WEBHOOK: ${{ secrets.SLACK_GHA_SUCCESS_WEBHOOK }} + SLACK_GHA_CANCELLED_WEBHOOK: ${{ secrets.SLACK_GHA_CANCELLED_WEBHOOK }} + SLACK_GHA_FIXED_WEBHOOK: ${{ secrets.SLACK_GHA_FIXED_WEBHOOK }} + SLACK_GHA_FAILURE_WEBHOOK: ${{ secrets.SLACK_GHA_FAILURE_WEBHOOK }} + + failed-workflow: + name: Failed workflow tasks + runs-on: ubuntu-latest + needs: [ test-build-scripts, bundle-theme, slack-notifications ] + if: | + always() && + github.repository == 'WordPress/wordpress-develop' && + github.event_name != 'pull_request' && + github.run_attempt < 2 && + ( + needs.test-build-scripts.result == 'cancelled' || needs.test-build-scripts.result == 'failure' || + needs.bundle-theme.result == 'cancelled' || needs.bundle-theme.result == 'failure' + ) + + steps: + - name: Dispatch workflow run + uses: actions/github-script@100527700e8b29ca817ac0e0dfbfc5e8ff38edda # v6.3.2 + 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 }}' + } + });