Skip to content

fix merge

fix merge #1

##
# A reusable workflow for posting messages to the Making WordPress
# Core Slack Instance by submitting data to Slack webhook URLs
# received by Slack Workflows.
##
name: Slack Notifications
on:
workflow_call:
inputs:
calling_status:
description: 'The status of the calling workflow'
type: string
required: true
secrets:
SLACK_GHA_SUCCESS_WEBHOOK:
description: 'The Slack webhook URL for a successful build.'
required: true
SLACK_GHA_CANCELLED_WEBHOOK:
description: 'The Slack webhook URL for a cancelled build.'
required: true
SLACK_GHA_FIXED_WEBHOOK:
description: 'The Slack webhook URL for a fixed build.'
required: true
SLACK_GHA_FAILURE_WEBHOOK:
description: 'The Slack webhook URL for a failed build.'
required: true
# Disable permissions for all available scopes by default.
# Any needed permissions should be configured at the job level.
permissions: {}
env:
CURRENT_BRANCH: ${{ github.ref_name }}
jobs:
# Gathers the details needed for Slack notifications.
#
# These details are passed as outputs to the subsequent, dependant jobs that
# submit data to Slack webhook URLs configured to post messages.
#
# Performs the following steps:
# - Retrieves the current workflow run.
# - Determines the conclusion of the previous workflow run or run attempt.
# - Sets the previous conclusion as an output.
# - Prepares the commit message.
# - Constructs and stores a message payload as an output.
prepare:
name: Prepare notifications
runs-on: ubuntu-24.04
permissions:
actions: read
contents: read
timeout-minutes: 5
if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event.workflow_run.event != 'pull_request' }}
outputs:
previous_conclusion: ${{ steps.previous-attempt-result.outputs.result }}
payload: ${{ steps.create-payload.outputs.payload }}
steps:
- name: Determine the status of the previous attempt
id: previous-attempt-result
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with:
retries: 2
retry-exempt-status-codes: 418
result-encoding: string
script: |
const workflow_run = await github.rest.actions.getWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: `${context.runId}`,
});
if ( process.env.CALLING_STATUS == 'failure' && workflow_run.data.run_attempt == 1 ) {
return 'first-failure';
}
// When a workflow has been restarted, check the previous run attempt. Because workflows are automatically
// restarted once and a failure on the first run is not reported, failures on the second run should not be
// considered.
if ( workflow_run.data.run_attempt > 2 ) {
const previous_run = await github.rest.actions.getWorkflowRunAttempt({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: `${context.runId}`,
attempt_number: workflow_run.data.run_attempt - 1
});
return previous_run.data.conclusion;
}
// Otherwise, check the previous workflow run.
const previous_runs = await github.rest.actions.listWorkflowRuns({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: workflow_run.data.workflow_id,
branch: process.env.CURRENT_BRANCH,
exclude_pull_requests: true,
});
// This is the first workflow run for this branch or tag.
if ( previous_runs.data.workflow_runs.length < 2 ) {
return 'none';
}
const expected_events = new Array( 'push', 'schedule', 'workflow_dispatch' );
// Find the workflow run for the commit that immediately preceded this one.
for ( let i = 0; i < previous_runs.data.workflow_runs.length; i++ ) {
if ( previous_runs.data.workflow_runs[ i ].run_number == workflow_run.data.run_number ) {
let next_index = i;
do {
next_index++;
// Protects against a false notification when contributors use the trunk branch as the pull request head_ref.
if ( expected_events.indexOf( previous_runs.data.workflow_runs[ next_index ].event ) == -1 ) {
continue;
}
return previous_runs.data.workflow_runs[ next_index ].conclusion;
} while ( next_index < previous_runs.data.workflow_runs.length );
}
}
// Can't determine previous workflow conclusion.
return 'unknown';
env:
CALLING_STATUS: ${{ inputs.calling_status }}
- name: Get the commit message
id: current-commit-message
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' }}
with:
retries: 2
retry-exempt-status-codes: 418
result-encoding: string
script: |
const commit_details = await github.rest.repos.getCommit({
owner: context.repo.owner,
repo: context.repo.repo,
ref: context.sha,
});
return commit_details.data.commit.message;
- name: Construct payload and store as an output
id: create-payload
run: |
COMMIT_MSG="$(echo "${COMMIT_MSG_RAW}" | awk 'NR==1')"
PAYLOAD="$( jq \
-n \
--arg workflow_name "${GITHUB_WORKFLOW}" \
--arg ref_name "${CURRENT_BRANCH}" \
--arg run_url "https://github.com/WordPress/wordpress-develop/actions/runs/${GITHUB_RUN_ID}/attempts/${GITHUB_RUN_ATTEMPT}" \
--arg commit_message "${COMMIT_MSG}" \
'{workflow_name: $workflow_name, ref_name: $ref_name, run_url: $run_url, commit_message: $commit_message}' | jq -c .
)"
echo "payload=$PAYLOAD" >> "$GITHUB_OUTPUT"
env:
COMMIT_MSG_RAW: ${{ ( github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' ) && steps.current-commit-message.outputs.result || github.event.head_commit.message }}
# Posts notifications when a workflow fails.
failure:
name: Failure notifications
permissions: {}
runs-on: ubuntu-24.04
timeout-minutes: 20
needs: [ prepare ]
if: ${{ needs.prepare.outputs.previous_conclusion != 'first-failure' && inputs.calling_status == 'failure' || failure() }}
steps:
- name: Post failure notifications to Slack
<<<<<<< Updated upstream

Check failure on line 174 in .github/workflows/slack-notifications.yml

View workflow run for this annotation

GitHub Actions / .github/workflows/slack-notifications.yml

Invalid workflow file

You have an error in your yaml syntax on line 174
<<<<<<< Updated upstream
uses: slackapi/slack-github-action@70cd7be8e40a46e8b0eced40b0de447bdb42f68e # v1.26.0
=======
uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0
>>>>>>> Stashed changes
=======
uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0
>>>>>>> Stashed changes
with:
webhook-type: webhook-trigger
webhook: ${{ secrets.SLACK_GHA_FAILURE_WEBHOOK }}
payload: ${{ needs.prepare.outputs.payload }}
# Posts notifications the first time a workflow run succeeds after previously failing.
fixed:
name: Fixed notifications
permissions: {}
runs-on: ubuntu-24.04
timeout-minutes: 20
needs: [ prepare ]
if: ${{ contains( fromJson( '["failure", "cancelled", "none"]' ), needs.prepare.outputs.previous_conclusion ) && inputs.calling_status == 'success' && success() }}
steps:
- name: Post failure notifications to Slack
<<<<<<< Updated upstream
<<<<<<< Updated upstream
uses: slackapi/slack-github-action@70cd7be8e40a46e8b0eced40b0de447bdb42f68e # v1.26.0
=======
uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0
>>>>>>> Stashed changes
=======
uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0
>>>>>>> Stashed changes
with:
webhook-type: webhook-trigger
webhook: ${{ secrets.SLACK_GHA_FIXED_WEBHOOK }}
payload: ${{ needs.prepare.outputs.payload }}
# Posts notifications when a workflow is successful.
success:
name: Success notifications
permissions: {}
runs-on: ubuntu-24.04
timeout-minutes: 20
needs: [ prepare ]
if: ${{ inputs.calling_status == 'success' && success() }}
steps:
- name: Post success notifications to Slack
<<<<<<< Updated upstream
<<<<<<< Updated upstream
uses: slackapi/slack-github-action@70cd7be8e40a46e8b0eced40b0de447bdb42f68e # v1.26.0
=======
uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0
>>>>>>> Stashed changes
=======
uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0
>>>>>>> Stashed changes
with:
webhook-type: webhook-trigger
webhook: ${{ secrets.SLACK_GHA_SUCCESS_WEBHOOK }}
payload: ${{ needs.prepare.outputs.payload }}
# Posts notifications when a workflow is cancelled.
cancelled:
name: Cancelled notifications
permissions: {}
runs-on: ubuntu-24.04
timeout-minutes: 20
needs: [ prepare ]
if: ${{ inputs.calling_status == 'cancelled' || cancelled() }}
steps:
- name: Post cancelled notifications to Slack
<<<<<<< Updated upstream
<<<<<<< Updated upstream
uses: slackapi/slack-github-action@70cd7be8e40a46e8b0eced40b0de447bdb42f68e # v1.26.0
=======
uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0
>>>>>>> Stashed changes
=======
uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0
>>>>>>> Stashed changes
with:
webhook-type: webhook-trigger
webhook: ${{ secrets.SLACK_GHA_CANCELLED_WEBHOOK }}
payload: ${{ needs.prepare.outputs.payload }}