Skip to content

Commit 7efa1cd

Browse files
feat: Add automatic Telegram notification after NuGet publish
1 parent 9eff449 commit 7efa1cd

File tree

1 file changed

+190
-0
lines changed

1 file changed

+190
-0
lines changed
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
name: Auto Telegram Notification
2+
3+
on:
4+
workflow_run:
5+
workflows: ["📦 Publish Package"]
6+
types:
7+
- completed
8+
9+
env:
10+
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
11+
DOTNET_NOLOGO: true
12+
13+
jobs:
14+
notify:
15+
name: Send Release Notification
16+
runs-on: ubuntu-latest
17+
if: ${{ github.event.workflow_run.conclusion == 'success' }}
18+
19+
permissions:
20+
contents: read
21+
22+
steps:
23+
- name: Checkout
24+
uses: actions/checkout@v4
25+
with:
26+
fetch-depth: 0
27+
28+
- name: Get Release Info
29+
id: release_info
30+
env:
31+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
32+
run: |
33+
echo "Fetching latest release..."
34+
35+
RELEASE_DATA=$(gh api repos/${{ github.repository }}/releases --jq '.[0]')
36+
37+
if [ -z "$RELEASE_DATA" ] || [ "$RELEASE_DATA" == "null" ]; then
38+
echo "No release found!"
39+
exit 1
40+
fi
41+
42+
TAG_NAME=$(echo "$RELEASE_DATA" | jq -r '.tag_name // empty')
43+
NAME=$(echo "$RELEASE_DATA" | jq -r '.name // empty')
44+
BODY=$(echo "$RELEASE_DATA" | jq -r '.body // empty')
45+
URL=$(echo "$RELEASE_DATA" | jq -r '.html_url // empty')
46+
IS_PRERELEASE=$(echo "$RELEASE_DATA" | jq -r '.prerelease // false')
47+
PUBLISHED_AT=$(echo "$RELEASE_DATA" | jq -r '.published_at // empty')
48+
49+
VERSION="${TAG_NAME#v}"
50+
51+
echo "Found release: $TAG_NAME (version: $VERSION)"
52+
53+
echo "tag_name=$TAG_NAME" >> "$GITHUB_OUTPUT"
54+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
55+
echo "name=$NAME" >> "$GITHUB_OUTPUT"
56+
echo "url=$URL" >> "$GITHUB_OUTPUT"
57+
echo "is_prerelease=$IS_PRERELEASE" >> "$GITHUB_OUTPUT"
58+
echo "published_at=$PUBLISHED_AT" >> "$GITHUB_OUTPUT"
59+
60+
printf '%s' "$BODY" > release_body.txt
61+
echo "Release body saved to file"
62+
63+
- name: Prepare Telegram Message
64+
id: prepare_message
65+
run: |
66+
TAG_NAME="${{ steps.release_info.outputs.tag_name }}"
67+
VERSION="${{ steps.release_info.outputs.version }}"
68+
NAME="${{ steps.release_info.outputs.name }}"
69+
URL="${{ steps.release_info.outputs.url }}"
70+
IS_PRERELEASE="${{ steps.release_info.outputs.is_prerelease }}"
71+
PUBLISHED_AT="${{ steps.release_info.outputs.published_at }}"
72+
73+
BODY=$(cat release_body.txt 2>/dev/null || echo "")
74+
75+
# Escape HTML special chars
76+
BODY_HTML=$(echo "$BODY" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
77+
78+
# Convert markdown to HTML
79+
BODY_HTML=$(echo "$BODY_HTML" | \
80+
sed 's/^### \(.*\)$/<b>\1<\/b>/g' | \
81+
sed 's/^## \(.*\)$/<b>\1<\/b>/g' | \
82+
sed 's/^# \(.*\)$/<b>\1<\/b>/g' | \
83+
sed 's/\*\*\([^*]*\)\*\*/<b>\1<\/b>/g' | \
84+
sed 's/`\([^`]*\)`/<code>\1<\/code>/g')
85+
86+
# Truncate if too long
87+
if [ ${#BODY_HTML} -gt 1800 ]; then
88+
BODY_HTML="${BODY_HTML:0:1800}... (truncated)"
89+
fi
90+
91+
if [ "$IS_PRERELEASE" == "true" ]; then
92+
RELEASE_TYPE="Pre-release"
93+
else
94+
RELEASE_TYPE="Stable Release"
95+
fi
96+
97+
if [ -n "$PUBLISHED_AT" ]; then
98+
FORMATTED_DATE=$(date -d "$PUBLISHED_AT" "+%Y-%m-%d %H:%M UTC" 2>/dev/null || echo "$PUBLISHED_AT")
99+
else
100+
FORMATTED_DATE="N/A"
101+
fi
102+
103+
# Build message
104+
cat > telegram_message.txt << MSGEOF
105+
JsonViewer.Blazor - New Release Published!
106+
107+
${RELEASE_TYPE}
108+
109+
Version: ${TAG_NAME}
110+
Name: ${NAME}
111+
Published: ${FORMATTED_DATE}
112+
113+
Release Notes:
114+
${BODY_HTML}
115+
116+
Links:
117+
- GitHub: ${URL}
118+
- NuGet: https://www.nuget.org/packages/JsonViewer.Blazor/${VERSION}
119+
120+
Install:
121+
dotnet add package JsonViewer.Blazor --version ${VERSION}
122+
123+
#JsonViewer #Blazor #DotNet #OpenSource
124+
MSGEOF
125+
126+
echo "Message prepared successfully!"
127+
echo "Message length: $(wc -c < telegram_message.txt) bytes"
128+
129+
- name: Send to Telegram Channel
130+
env:
131+
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
132+
TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
133+
run: |
134+
if [ -z "$TELEGRAM_BOT_TOKEN" ] || [ -z "$TELEGRAM_CHAT_ID" ]; then
135+
echo "Telegram credentials not configured!"
136+
echo "Please set TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID secrets."
137+
exit 1
138+
fi
139+
140+
MESSAGE=$(cat telegram_message.txt)
141+
142+
echo "Sending message to Telegram..."
143+
144+
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \
145+
"https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
146+
-H "Content-Type: application/json" \
147+
-d "$(jq -n \
148+
--arg chat_id "$TELEGRAM_CHAT_ID" \
149+
--arg text "$MESSAGE" \
150+
'{chat_id: $chat_id, text: $text, parse_mode: "HTML", disable_web_page_preview: false}')")
151+
152+
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
153+
RESP_BODY=$(echo "$RESPONSE" | sed '$d')
154+
155+
if [ "$HTTP_CODE" -eq 200 ] && echo "$RESP_BODY" | jq -e '.ok == true' > /dev/null 2>&1; then
156+
echo "Message sent successfully!"
157+
MESSAGE_ID=$(echo "$RESP_BODY" | jq -r '.result.message_id')
158+
echo "Message ID: $MESSAGE_ID"
159+
else
160+
echo "Failed to send message!"
161+
echo "HTTP Code: $HTTP_CODE"
162+
echo "Response: $RESP_BODY"
163+
exit 1
164+
fi
165+
166+
- name: Summary
167+
if: always()
168+
run: |
169+
echo "## Telegram Notification Summary" >> "$GITHUB_STEP_SUMMARY"
170+
echo "" >> "$GITHUB_STEP_SUMMARY"
171+
echo "### Release Info" >> "$GITHUB_STEP_SUMMARY"
172+
echo "| Property | Value |" >> "$GITHUB_STEP_SUMMARY"
173+
echo "|----------|-------|" >> "$GITHUB_STEP_SUMMARY"
174+
echo "| **Tag** | ${{ steps.release_info.outputs.tag_name }} |" >> "$GITHUB_STEP_SUMMARY"
175+
echo "| **Version** | ${{ steps.release_info.outputs.version }} |" >> "$GITHUB_STEP_SUMMARY"
176+
echo "| **Name** | ${{ steps.release_info.outputs.name }} |" >> "$GITHUB_STEP_SUMMARY"
177+
if [ "${{ steps.release_info.outputs.is_prerelease }}" == "true" ]; then
178+
echo "| **Type** | Pre-release |" >> "$GITHUB_STEP_SUMMARY"
179+
else
180+
echo "| **Type** | Stable |" >> "$GITHUB_STEP_SUMMARY"
181+
fi
182+
echo "" >> "$GITHUB_STEP_SUMMARY"
183+
echo "### Links" >> "$GITHUB_STEP_SUMMARY"
184+
echo "- [GitHub Release](${{ steps.release_info.outputs.url }})" >> "$GITHUB_STEP_SUMMARY"
185+
echo "- [NuGet Package](https://www.nuget.org/packages/JsonViewer.Blazor/${{ steps.release_info.outputs.version }})" >> "$GITHUB_STEP_SUMMARY"
186+
echo "" >> "$GITHUB_STEP_SUMMARY"
187+
echo "### Trigger Info" >> "$GITHUB_STEP_SUMMARY"
188+
echo "- Triggered by: **${{ github.event.workflow_run.name }}**" >> "$GITHUB_STEP_SUMMARY"
189+
echo "- Workflow Run: [#${{ github.event.workflow_run.run_number }}](${{ github.event.workflow_run.html_url }})" >> "$GITHUB_STEP_SUMMARY"
190+

0 commit comments

Comments
 (0)