Skip to content

Commit 5eace4c

Browse files
committed
ci: Post a message on Slack when a new release is published
Signed-off-by: Ferenc Géczi <[email protected]>
1 parent 1fcc4d7 commit 5eace4c

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
name: Slack Post
2+
on:
3+
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#release
4+
release:
5+
types: [published]
6+
jobs:
7+
build:
8+
name: Slack Post
9+
runs-on: ubuntu-latest
10+
steps:
11+
- run: |
12+
echo "New release published ${GITHUB_REF}"
13+
pip3 install PyGithub
14+
./bin/announce_release_on_slack.py
15+
env:
16+
GITHUB_RELEASE_TAG: ${{ basename GITHUB_REF }}
17+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
18+
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
19+
SLACK_CHANNEL_ID_RELEASES: ${{ secrets.SLACK_CHANNEL_ID_RELEASES }}

bin/announce_release_on_slack.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#!/usr/bin/env python3
2+
3+
import json
4+
import logging
5+
import os
6+
import requests
7+
import sys
8+
9+
from github import Github
10+
11+
12+
def ensure_environment_variables_are_present():
13+
required_env_vars = ('GITHUB_RELEASE_TAG', 'GITHUB_TOKEN',
14+
'SLACK_BOT_TOKEN', 'SLACK_CHANNEL_ID_RELEASES')
15+
16+
for v in required_env_vars:
17+
if not os.environ.get(v):
18+
logging.fatal("A required environment variable is missing: %s", v)
19+
sys.exit(1)
20+
21+
22+
def get_gh_release_info_text_with_token(release_tag, access_token):
23+
g = Github(access_token)
24+
repo_name = "instana/python-sensor"
25+
repo = g.get_repo(repo_name)
26+
release = repo.get_release(release_tag)
27+
28+
logging.info("GH Release fetched successfully %s", release)
29+
30+
msg = (
31+
f":mega: :package: A new version is released in {repo_name}\n"
32+
f"Name: {release.title}\n"
33+
f"Tag: {release.tag_name}\n"
34+
f"Created at: {release.created_at}\n"
35+
f"Published at: {release.published_at}\n"
36+
f"{release.body}\n")
37+
38+
logging.info(msg)
39+
return msg
40+
41+
42+
def post_on_slack_channel(slack_token, slack_channel_id, message_text):
43+
api_url = "https://slack.com/api/chat.postMessage"
44+
45+
headers = {"Authorization": f"Bearer {slack_token}",
46+
"Content-Type": "application/json"}
47+
body = {"channel": slack_channel_id, "text": message_text}
48+
49+
response = requests.post(api_url, headers=headers, data=json.dumps(body))
50+
response_data = json.loads(response.text)
51+
52+
if response_data["ok"]:
53+
logging.info("Message sent successfully!")
54+
else:
55+
logging.fatal("Error sending message: %s", response_data['error'])
56+
57+
58+
def main():
59+
# Setting this globally to DEBUG will also debug PyGithub,
60+
# which will produce even more log output
61+
logging.basicConfig(level=logging.INFO)
62+
ensure_environment_variables_are_present()
63+
64+
msg = get_gh_release_info_text_with_token(os.environ['GITHUB_RELEASE_TAG'],
65+
os.environ['GITHUB_TOKEN'])
66+
67+
post_on_slack_channel(os.environ['SLACK_BOT_TOKEN'],
68+
os.environ['SLACK_CHANNEL_ID_RELEASES'],
69+
msg)
70+
71+
72+
if __name__ == "__main__":
73+
main()

0 commit comments

Comments
 (0)