1cfdcb88d3
- 简化消息内容,仅保留标题、版本号等关键信息 - Docker 构建前发送构建中通知 - Docker 构建成功后添加部署文档链接 - PR 合并消息标题改为 'main 分支代码更新'
104 lines
4.1 KiB
YAML
104 lines
4.1 KiB
YAML
name: Telegram Notification on PR Merge
|
||
|
||
on:
|
||
pull_request:
|
||
types:
|
||
- closed # 当 PR 被关闭(合并或关闭)时触发
|
||
|
||
jobs:
|
||
notify:
|
||
runs-on: ubuntu-latest
|
||
|
||
# 只在 PR 被合并到 main 分支时执行
|
||
if: github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'main'
|
||
|
||
steps:
|
||
- name: Checkout code
|
||
uses: actions/checkout@v4
|
||
|
||
- name: Get PR details
|
||
id: pr_details
|
||
env:
|
||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
run: |
|
||
PR_NUMBER="${{ github.event.pull_request.number }}"
|
||
REPO="${{ github.repository }}"
|
||
|
||
# 获取 PR 详细信息
|
||
PR_RESPONSE=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" \
|
||
-H "Accept: application/vnd.github.v3+json" \
|
||
"https://api.github.com/repos/${REPO}/pulls/${PR_NUMBER}")
|
||
|
||
# 获取 PR 变更的文件列表
|
||
FILES_RESPONSE=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" \
|
||
-H "Accept: application/vnd.github.v3+json" \
|
||
"https://api.github.com/repos/${REPO}/pulls/${PR_NUMBER}/files")
|
||
|
||
# 提取 PR 描述(body),保留换行,限制长度
|
||
PR_BODY=$(echo "$PR_RESPONSE" | jq -r '.body // ""')
|
||
if [ ${#PR_BODY} -gt 500 ]; then
|
||
PR_BODY="${PR_BODY:0:500}..."
|
||
fi
|
||
|
||
# 保存到输出变量(使用 base64 编码避免特殊字符问题)
|
||
echo "pr_body<<EOF" >> $GITHUB_OUTPUT
|
||
echo "$PR_BODY" >> $GITHUB_OUTPUT
|
||
echo "EOF" >> $GITHUB_OUTPUT
|
||
|
||
- name: Send Telegram notification
|
||
env:
|
||
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
|
||
TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
|
||
run: |
|
||
# 检查 PR 是否被合并(而不是仅关闭)
|
||
PR_MERGED="${{ github.event.pull_request.merged }}"
|
||
if [ "$PR_MERGED" != "true" ]; then
|
||
echo "ℹ️ PR 仅关闭,未合并,跳过通知"
|
||
exit 0
|
||
fi
|
||
|
||
# 检查必要的环境变量
|
||
# 注意:TELEGRAM_CHAT_ID 可以是个人聊天 ID(正数)或群组 ID(负数,如 -1001234567890)
|
||
if [ -z "$TELEGRAM_BOT_TOKEN" ] || [ -z "$TELEGRAM_CHAT_ID" ]; then
|
||
echo "⚠️ Telegram Bot Token 或 Chat ID 未配置,跳过通知"
|
||
exit 0
|
||
fi
|
||
|
||
# 获取 PR 基本信息
|
||
PR_NUMBER="${{ github.event.pull_request.number }}"
|
||
PR_TITLE="${{ github.event.pull_request.title }}"
|
||
PR_URL="${{ github.event.pull_request.html_url }}"
|
||
PR_MERGE_COMMIT="${{ github.event.pull_request.merge_commit_sha }}"
|
||
|
||
# 获取 PR 详细信息
|
||
PR_BODY="${{ steps.pr_details.outputs.pr_body }}"
|
||
|
||
# 转义 PR 标题中的 HTML 特殊字符
|
||
PR_TITLE_ESCAPED=$(echo "$PR_TITLE" | sed 's/&/\&/g' | sed 's/</\</g' | sed 's/>/\>/g')
|
||
|
||
# 构建消息内容(仅包含关键信息)
|
||
MESSAGE="🚀 <b>main 分支代码更新</b>"$'\n'$'\n'"📝 <b>PR #${PR_NUMBER}:</b> ${PR_TITLE_ESCAPED}"$'\n'"🔗 <a href=\"${PR_URL}\">查看 PR</a>"
|
||
|
||
# 发送 Telegram 消息(使用 jq 转义 JSON)
|
||
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
|
||
-H "Content-Type: application/json" \
|
||
-d "$(jq -n \
|
||
--arg chat_id "$TELEGRAM_CHAT_ID" \
|
||
--arg text "$MESSAGE" \
|
||
'{chat_id: $chat_id, text: $text, parse_mode: "HTML", disable_web_page_preview: false}')" > /tmp/telegram_response.json
|
||
|
||
# 检查发送结果
|
||
if [ $? -eq 0 ]; then
|
||
RESPONSE=$(cat /tmp/telegram_response.json)
|
||
if echo "$RESPONSE" | grep -q '"ok":true'; then
|
||
echo "✅ Telegram 通知发送成功"
|
||
else
|
||
echo "❌ Telegram 通知发送失败: $RESPONSE"
|
||
exit 1
|
||
fi
|
||
else
|
||
echo "❌ 发送 Telegram 消息时发生错误"
|
||
exit 1
|
||
fi
|
||
|