diff --git a/.github/workflows/coding-standards.yml b/.github/workflows/coding-standards.yml index 20d3d89c61..5b475a90f1 100644 --- a/.github/workflows/coding-standards.yml +++ b/.github/workflows/coding-standards.yml @@ -173,3 +173,33 @@ jobs: 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: [ phpcs, jshint, slack-notifications ] + if: | + always() && + github.repository == 'WordPress/wordpress-develop' && + github.event_name != 'pull_request' && + github.run_number < 2 && + ( + needs.phpcs.result == 'cancelled' || needs.phpcs.result == 'failure' || + needs.jshint.result == 'cancelled' || needs.jshint.result == 'failure' + ) + + steps: + - name: Dispatch workflow run + uses: actions/github-script@c713e510dbd7d213d92d41b7a7805a986f4c5c66 # v6.2.0 + with: + github-token: ${{ secrets.GHA_WORKFLOW_DISPATCH }} + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'failed-workflow.yml', + ref: '${{ github.ref_name }}', + inputs: { + run_id: '${{ github.run_id }}' + } + }); diff --git a/.github/workflows/end-to-end-tests.yml b/.github/workflows/end-to-end-tests.yml index 2832570430..5deda46f72 100644 --- a/.github/workflows/end-to-end-tests.yml +++ b/.github/workflows/end-to-end-tests.yml @@ -130,3 +130,32 @@ jobs: 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: [ e2e-tests, slack-notifications ] + if: | + always() && + github.repository == 'WordPress/wordpress-develop' && + github.event_name != 'pull_request' && + github.run_number < 2 && + ( + needs.e2e-tests.result == 'cancelled' || needs.e2e-tests.result == 'failure' + ) + + steps: + - name: Dispatch workflow run + uses: actions/github-script@c713e510dbd7d213d92d41b7a7805a986f4c5c66 # v6.2.0 + with: + github-token: ${{ secrets.GHA_WORKFLOW_DISPATCH }} + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'failed-workflow.yml', + ref: '${{ github.ref_name }}', + inputs: { + run_id: '${{ github.run_id }}' + } + }); diff --git a/.github/workflows/failed-workflow.yml b/.github/workflows/failed-workflow.yml new file mode 100644 index 0000000000..75f71a4d2b --- /dev/null +++ b/.github/workflows/failed-workflow.yml @@ -0,0 +1,45 @@ +## +# Performs follow-up tasks when a workflow fails or is cancelled. +## +name: Failed Workflow + +on: + workflow_dispatch: + inputs: + run_id: + description: 'ID of the GitHub Action workflow run to rerun' + required: true + type: 'string' + +jobs: + # Attempts to rerun a workflow. + # + # Performs the following steps: + # - Retrieves the workflow run that dispatched this workflow. + # - Restarts all failed jobs when the workflow fails or is cancelled for the first time. + failed-workflow: + name: Rerun a workflow + runs-on: ubuntu-latest + timeout-minutes: 5 + + steps: + - name: Rerun a workflow + uses: actions/github-script@c713e510dbd7d213d92d41b7a7805a986f4c5c66 # v6.2.0 + with: + script: | + const workflow_run = await github.rest.actions.getWorkflowRun({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: ${{ inputs.run_id }}, + }); + + // Only rerun after the first run attempt. + if ( workflow_run.data.run_attempt > 1 ) { + return; + } + + const rerun = await github.rest.actions.reRunWorkflowFailedJobs({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: ${{ inputs.run_id }}, + }); diff --git a/.github/workflows/javascript-tests.yml b/.github/workflows/javascript-tests.yml index e148117362..ea4575822f 100644 --- a/.github/workflows/javascript-tests.yml +++ b/.github/workflows/javascript-tests.yml @@ -98,3 +98,32 @@ jobs: 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-js, slack-notifications ] + if: | + always() && + github.repository == 'WordPress/wordpress-develop' && + github.event_name != 'pull_request' && + github.run_number < 2 && + ( + needs.test-js.result == 'cancelled' || needs.test-js.result == 'failure' + ) + + steps: + - name: Dispatch workflow run + uses: actions/github-script@c713e510dbd7d213d92d41b7a7805a986f4c5c66 # v6.2.0 + with: + github-token: ${{ secrets.GHA_WORKFLOW_DISPATCH }} + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'failed-workflow.yml', + ref: '${{ github.ref_name }}', + inputs: { + run_id: '${{ github.run_id }}' + } + }); diff --git a/.github/workflows/php-compatibility.yml b/.github/workflows/php-compatibility.yml index e4ca2177fc..c2b5a2d6ac 100644 --- a/.github/workflows/php-compatibility.yml +++ b/.github/workflows/php-compatibility.yml @@ -114,3 +114,32 @@ jobs: 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: [ php-compatibility, slack-notifications ] + if: | + always() && + github.repository == 'WordPress/wordpress-develop' && + github.event_name != 'pull_request' && + github.run_number < 2 && + ( + needs.php-compatibility.result == 'cancelled' || needs.php-compatibility.result == 'failure' + ) + + steps: + - name: Dispatch workflow run + uses: actions/github-script@c713e510dbd7d213d92d41b7a7805a986f4c5c66 # v6.2.0 + with: + github-token: ${{ secrets.GHA_WORKFLOW_DISPATCH }} + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'failed-workflow.yml', + ref: '${{ github.ref_name }}', + inputs: { + run_id: '${{ github.run_id }}' + } + }); diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 6fd808f429..7e2b3b294c 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -246,3 +246,32 @@ jobs: 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-php, slack-notifications ] + if: | + always() && + github.repository == 'WordPress/wordpress-develop' && + github.event_name != 'pull_request' && + github.run_number < 2 && + ( + needs.test-php.result == 'cancelled' || needs.test-php.result == 'failure' + ) + + steps: + - name: Dispatch workflow run + uses: actions/github-script@c713e510dbd7d213d92d41b7a7805a986f4c5c66 # v6.2.0 + with: + github-token: ${{ secrets.GHA_WORKFLOW_DISPATCH }} + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'failed-workflow.yml', + ref: '${{ github.ref_name }}', + inputs: { + run_id: '${{ github.run_id }}' + } + }); diff --git a/.github/workflows/slack-notifications.yml b/.github/workflows/slack-notifications.yml index 3b5d260ae0..cd4502499c 100644 --- a/.github/workflows/slack-notifications.yml +++ b/.github/workflows/slack-notifications.yml @@ -53,7 +53,7 @@ jobs: steps: - name: Determine the status of the previous attempt id: previous-attempt-result - uses: actions/github-script@d50f485531ba88479582bc2da03ff424389af5c1 # v6.1.1 + uses: actions/github-script@c713e510dbd7d213d92d41b7a7805a986f4c5c66 # v6.2.0 with: script: | const workflow_run = await github.rest.actions.getWorkflowRun({ @@ -116,7 +116,7 @@ jobs: - name: Get the commit message id: current-commit-message - uses: actions/github-script@d50f485531ba88479582bc2da03ff424389af5c1 # v6.1.1 + uses: actions/github-script@c713e510dbd7d213d92d41b7a7805a986f4c5c66 # v6.2.0 if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' }} with: script: | diff --git a/.github/workflows/test-coverage.yml b/.github/workflows/test-coverage.yml index e02f5b7470..9efb87e86c 100644 --- a/.github/workflows/test-coverage.yml +++ b/.github/workflows/test-coverage.yml @@ -193,3 +193,32 @@ jobs: 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-coverage-report, slack-notifications ] + if: | + always() && + github.repository == 'WordPress/wordpress-develop' && + github.event_name != 'pull_request' && + github.run_number < 2 && + ( + needs.test-coverage-report.result == 'cancelled' || needs.test-coverage-report.result == 'failure' + ) + + steps: + - name: Dispatch workflow run + uses: actions/github-script@c713e510dbd7d213d92d41b7a7805a986f4c5c66 # v6.2.0 + with: + github-token: ${{ secrets.GHA_WORKFLOW_DISPATCH }} + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'failed-workflow.yml', + ref: '${{ github.ref_name }}', + inputs: { + run_id: '${{ github.run_id }}' + } + }); diff --git a/.github/workflows/test-npm.yml b/.github/workflows/test-npm.yml index 1a192780d7..78a1fe839f 100644 --- a/.github/workflows/test-npm.yml +++ b/.github/workflows/test-npm.yml @@ -171,3 +171,33 @@ jobs: 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-npm, test-npm-macos, slack-notifications ] + if: | + always() && + github.repository == 'WordPress/wordpress-develop' && + github.event_name != 'pull_request' && + github.run_number < 2 && + ( + needs.test-npm.result == 'cancelled' || needs.test-npm.result == 'failure' || + needs.test-npm-macos.result == 'cancelled' || needs.test-npm-macos.result == 'failure' + ) + + steps: + - name: Dispatch workflow run + uses: actions/github-script@c713e510dbd7d213d92d41b7a7805a986f4c5c66 # v6.2.0 + with: + github-token: ${{ secrets.GHA_WORKFLOW_DISPATCH }} + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'failed-workflow.yml', + ref: '${{ github.ref_name }}', + inputs: { + run_id: '${{ github.run_id }}' + } + }); diff --git a/.github/workflows/test-old-branches.yml b/.github/workflows/test-old-branches.yml index 6dd2730c34..01de1f3bab 100644 --- a/.github/workflows/test-old-branches.yml +++ b/.github/workflows/test-old-branches.yml @@ -67,10 +67,10 @@ jobs: # Run all branches monthly, but only the currently supported one twice per month. steps: - name: Dispatch workflow run - uses: actions/github-script@d50f485531ba88479582bc2da03ff424389af5c1 # v6.1.1 + uses: actions/github-script@c713e510dbd7d213d92d41b7a7805a986f4c5c66 # v6.2.0 if: ${{ github.event_name == 'push' || github.event.schedule == '0 0 15 * *' || matrix.branch == '6.0' }} with: - github-token: ${{ secrets.GHA_OLD_BRANCH_DISPATCH }} + github-token: ${{ secrets.GHA_WORKFLOW_DISPATCH }} script: | github.rest.actions.createWorkflowDispatch({ owner: context.repo.owner,