ci(close-issue): add Telegram notification when AI-fixed issue is closed
- Get issue details (title, url) for TG message - Send TG via TELEGRAM_BOT_TOKEN/TELEGRAM_CHAT_ID (same as docker-build) - Use GH_TOKEN from GITHUB_TOKEN for gh CLI Made-with: Cursor
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
# PR 合并后自动关闭关联的 Issue
|
# PR 合并后自动关闭关联的 Issue
|
||||||
# 当 PR 从 ai_fix/N_xxx 分支合并到 main 时,关闭 #N 对应的 Issue(若 PR 描述中未含 Closes #N 则通过分支名解析)
|
# 当 PR 从 ai_fix/N_xxx 分支合并到 main 时,关闭 #N 对应的 Issue(若 PR 描述中未含 Closes #N 则通过分支名解析)
|
||||||
|
# 关闭后发送 Telegram 通知(复用 TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID)
|
||||||
|
|
||||||
name: Close issue on PR merge
|
name: Close issue on PR merge
|
||||||
|
|
||||||
@@ -42,6 +43,22 @@ jobs:
|
|||||||
echo "skip=false" >> $GITHUB_OUTPUT
|
echo "skip=false" >> $GITHUB_OUTPUT
|
||||||
echo "解析到 Issue #$ISSUE_NUM"
|
echo "解析到 Issue #$ISSUE_NUM"
|
||||||
|
|
||||||
|
- name: Get issue details
|
||||||
|
if: steps.pr.outputs.skip != 'true'
|
||||||
|
id: issue
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
ISSUE_NUM="${{ steps.pr.outputs.ISSUE_NUMBER }}"
|
||||||
|
# 获取 issue 标题与 URL(用于 TG 消息)
|
||||||
|
JSON=$(gh issue view "$ISSUE_NUM" --json title,url 2>/dev/null || echo '{"title":"","url":""}')
|
||||||
|
TITLE=$(echo "$JSON" | jq -r '.title')
|
||||||
|
ISSUE_URL=$(echo "$JSON" | jq -r '.url')
|
||||||
|
echo "title<<EOF" >> $GITHUB_OUTPUT
|
||||||
|
echo "$TITLE" >> $GITHUB_OUTPUT
|
||||||
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
echo "url=$ISSUE_URL" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Close issue
|
- name: Close issue
|
||||||
if: steps.pr.outputs.skip != 'true'
|
if: steps.pr.outputs.skip != 'true'
|
||||||
uses: actions/github-script@v7
|
uses: actions/github-script@v7
|
||||||
@@ -68,3 +85,43 @@ jobs:
|
|||||||
} else {
|
} else {
|
||||||
console.log(`Issue #${issueNumber} already closed.`);
|
console.log(`Issue #${issueNumber} already closed.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- name: Send Telegram notification
|
||||||
|
if: steps.pr.outputs.skip != 'true'
|
||||||
|
env:
|
||||||
|
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
|
||||||
|
TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
|
||||||
|
run: |
|
||||||
|
# 与 docker-build 一致:未配置则跳过
|
||||||
|
if [ -z "$TELEGRAM_BOT_TOKEN" ] || [ -z "$TELEGRAM_CHAT_ID" ]; then
|
||||||
|
echo "⚠️ Telegram Bot Token 或 Chat ID 未配置,跳过通知"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ISSUE_NUM="${{ steps.pr.outputs.ISSUE_NUMBER }}"
|
||||||
|
ISSUE_TITLE="${{ steps.issue.outputs.title }}"
|
||||||
|
ISSUE_URL="${{ steps.issue.outputs.url }}"
|
||||||
|
PR_URL="${{ github.event.pull_request.html_url }}"
|
||||||
|
|
||||||
|
# 与 docker-build 相同的 HTML 消息格式
|
||||||
|
MESSAGE="✅ <b>AI 修复的 Issue 已关闭</b>"$'\n'$'\n'"🔢 <b>Issue:</b> #${ISSUE_NUM} ${ISSUE_TITLE}"$'\n'"📎 <a href=\"${ISSUE_URL}\">查看 Issue</a>"$'\n'"🔗 <a href=\"${PR_URL}\">查看 PR</a>"
|
||||||
|
|
||||||
|
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 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "❌ 发送 Telegram 消息时发生错误"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user