Have you ever wanted to get custom notifications in Slack about new interactions in your GitHub repository? If so, then you're in luck. With the help of GitHub actions and Slack's Block Kit, it is super easy to set up automated workflows that will send custom messages to your Slack channel of choice. In this article, I will guide you on how to set up the Slack bot and send automatic messages using GH actions.
Create a Slack app
Firstly, we need to create a new Slack application. Go to Slack's app page. If you haven't created an app before you should see:
otherwise you might see a list of your existing apps:
Let's click the Create an App
button. Frpm a modal that shows up, choose From scratch
option:
In the next step, we can choose the app's name (eg. My Awesome Slack App
) and pick a workspace that you want to use for testing the app.
After the app is created successfully, we need to configure a couple of additional options. Firstly we need to configure the OAuth & Permissions
section:
In the Scopes
section, we need to add a proper scope for our bot. Let's click Add an OAuth Scope
in the Bot Token Scopes
section, and select an incoming-webhook
scope:
Next, in OAuth Tokens for Your Workspace
section, click Install to Workspace
and choose a channel that you want messages to be posted to.
Finally, let's go to Incoming Webhooks page
, and activate the incoming hooks toggle (if it wasn't already activated).
Copy the webhook URL (we will need it for our GitHub action).
Create a Github Action Workflow
In this section, we will focus on setting up the GitHub action workflow that will post messages on behalf of the app we've just created. You can use any of your existing repositories, or create a new one.
Setting Up Secrets
In your repository, go to Settings
-> Secrets and variables
-> Actions
section and create a New Repository Secret
.
We will call the secret SLACK_WEBHOOK_URL
and paste the url we've previously copied as a value.
Create a workflow
To actually send a message we can use slackapi/slack-github-action GitHub action. To get started, we need to create a workflow file in .github/workflows
directory. Let's create .github/workflows/slack-message.yml
file to your repository with the following content and commit the changes to main
branch.
name: 'Send Slack notification'
on:
workflow_dispatch:
jobs:
send-slack-notification:
runs-on: ubuntu-latest
steps:
- name: Send message to Slack workflow
id: slack
uses: slackapi/slack-github-action@v1.24.0
with:
payload: |
{
"text": "Hello Slack",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "GitHub Action (${{ github.run_id }}) posted this message"
}
}
]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK
In this workflow, we've created a job that uses slackapi/slack-github-action
action and sends a basic message with an action run id. The important thing is that we need to set our webhook url as an env variable. This was the action can use it to send a message to the correct endpoint.
We've configured the action so that it can be triggered manually. Let's trigger it by going to Actions
-> Send Slack notification
We can run the workflow manually in the top right corner.
After running the workflow, we should see our first message in the Slack channel that we've configured earlier.
Manually triggering the workflow to send a message is not very useful. However, we now have the basics to create more useful actions.
Automatic message on pull request merge
Let's create an action that will send a notification to Slack about a new contribution to our repository. We will use Slack's Block Kit to construct our message.
Firstly, we need to modify our workflow so that instead of being manually triggered, it runs automatically when a pull requests to main
branch is merged. This can be configured in the on
section of the workflow file:
on:
pull_request:
branches:
- main
types:
- closed
Secondly, let's make sure that we only run the workflow when a pull request is merged and not eg. closed without merging. We can configure that by using if
condition on the job
:
- name: Send message to Slack workflow
id: slack
uses: slackapi/slack-github-action@v1.24.0
with:
payload: |
{
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": "A PR was just merged into ${{ github.repo }} :tada:",
"emoji": true
}
},
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*${{ github.event.pull_request.user.login }}* has just contributed to ${{ github.repository }} :partying_face:"
}
}
]
}
We've used a repository name (github.repository
) as well as the user login that created a pull request (github.event.pull_request.user.login
), but we could customize the message with as many information as we can find in the pull_request
event. If you want to quickly edit and preview the message template, you can use the Slack's Block Kit Builder.
Now we can create any PR, eg. add some changes to README.md, and after the PR is merged, we will get a Slack message like this.
Summary
As I have shown in this article, sending Slack messages automatically using GitHub actions is quite easy. If you want to check the real life example, visit the starter.dev project where we are using the slackapi/slack-github-action
to get notifications about new contributions (send-slack-notification.yml)
If you have any questions, you can always Tweet or DM me at @ktrz. I'm always happy to help!