Notify Slack user on workflow failure #4078
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Notify Slack user on workflow failure | |
on: | |
workflow_run: | |
workflows: ["Package & Release", "Build & Test"] | |
types: | |
- completed | |
branches: | |
- master | |
- release/* | |
- next/* | |
jobs: | |
notify_failure: | |
runs-on: ubuntu-latest | |
if: ${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.event != 'schedule' }} | |
steps: | |
- name: Fetch mapping file | |
id: fetch_mapping | |
uses: actions/github-script@v7 | |
env: | |
ACCESS_TOKEN: ${{ secrets.PAT }} | |
with: | |
script: | | |
const url = 'https://raw.githubusercontent.com/Kong/github-slack-mapping/main/mapping.json'; | |
const headers = {Authorization: `token ${process.env.ACCESS_TOKEN}`}; | |
const response = await fetch(url, {headers}); | |
const mapping = await response.json(); | |
return mapping; | |
- name: Retrieve PR info | |
id: retrieve_pr_info | |
env: | |
ACCESS_TOKEN: ${{ secrets.PAT }} | |
run: | | |
repo_name="${{ github.event.workflow_run.repository.full_name }}" | |
head_sha="${{ github.event.workflow_run.head_sha }}" | |
IFS=$'\t' read pr_html_url pr_user_login < <(curl -sS \ | |
-H "Authorization: Bearer ${{ env.ACCESS_TOKEN }}" \ | |
-H "Accept: application/vnd.github+json" \ | |
-H "X-GitHub-Api-Version: 2022-11-28" \ | |
"https://api.github.com/repos/$repo_name/commits/$head_sha/pulls" \ | |
| jq -r '.[0] | [.html_url, .user.login] | @tsv') | |
echo "pr_html_url=$pr_html_url" >> $GITHUB_OUTPUT | |
echo "pr_user_login=$pr_user_login" >> $GITHUB_OUTPUT | |
shell: bash | |
- name: Generate Slack Payload | |
id: generate-payload | |
env: | |
SLACK_CHANNEL: gateway-notifications | |
SLACK_MAPPING: "${{ steps.fetch_mapping.outputs.result }}" | |
uses: actions/github-script@v7 | |
with: | |
script: | | |
const pr_html_url = "${{ steps.retrieve_pr_info.outputs.pr_html_url }}"; | |
const workflow_name = "${{ github.event.workflow_run.name }}"; | |
const repo_name = "${{ github.event.workflow_run.repository.full_name }}"; | |
const branch_name = "${{ github.event.workflow_run.head_branch }}"; | |
const run_url = "${{ github.event.workflow_run.html_url }}"; | |
const slack_mapping = JSON.parse(process.env.SLACK_MAPPING); | |
const actor_github_id = "${{ steps.retrieve_pr_info.outputs.pr_user_login }}"; | |
const actor_slack_id = slack_mapping[actor_github_id]; | |
const actor = actor_slack_id ? `<@${actor_slack_id}>` : actor_github_id; | |
const payload = { | |
text: `${actor} , workflow “${workflow_name}” failed, repo: "${repo_name}", branch: "${branch_name}", PR: "${pr_html_url}". Please check it: ${run_url}.`, | |
channel: process.env.SLACK_CHANNEL, | |
}; | |
return JSON.stringify(payload); | |
result-encoding: string | |
- name: Send Slack Message | |
uses: slackapi/slack-github-action@70cd7be8e40a46e8b0eced40b0de447bdb42f68e # v1.26.0 | |
with: | |
payload: ${{ steps.generate-payload.outputs.result }} | |
env: | |
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_GATEWAY_NOTIFICATIONS_WEBHOOK }} |