Skip to content

Commit 82f49a9

Browse files
committed
feat(discord-notify): 扩展支持 PR 和 Release 事件通知
重构 Discord 通知 Action 以支持多种 GitHub 事件: - Push 事件:保留原有代码提交统计功能 - Pull Request 事件:新增对 opened、reopened、closed(merged 或未合并)状态的通知 - Release 事件:新增对 published 状态的通知 更新文档,详细说明各事件的通知样式和配置方法。
1 parent 6b9d863 commit 82f49a9

2 files changed

Lines changed: 189 additions & 57 deletions

File tree

Lines changed: 150 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: 'Discord 通知 (中文版)'
2-
description: '发送包含 Git 提交统计信息的 Discord 通知,支持中文展示'
2+
description: '发送 Git 提交、PR 变更或 Release 发布的 Discord 通知,支持中文展示'
33
inputs:
44
webhook_url:
55
description: 'Discord Webhook URL'
@@ -12,59 +12,167 @@ inputs:
1212
runs:
1313
using: "composite"
1414
steps:
15-
- name: 获取提交统计
16-
id: stats
15+
- name: 获取事件类型与统计
16+
id: info
1717
shell: bash
1818
run: |
19-
# 检查是否有足够的提交历史
20-
if git rev-parse HEAD~1 >/dev/null 2>&1; then
21-
CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD | wc -l | tr -d ' ')
22-
# 使用 grep -P 提取数字,如果失败则默认为 0
23-
ADDITIONS=$(git diff --shortstat HEAD~1 HEAD | grep -oE '[0-9]+ insertion' | grep -oE '[0-9]+' || echo 0)
24-
DELETIONS=$(git diff --shortstat HEAD~1 HEAD | grep -oE '[0-9]+ deletion' | grep -oE '[0-9]+' || echo 0)
25-
else
26-
echo "历史提交不足,跳过统计"
27-
CHANGED_FILES=1
28-
ADDITIONS=0
29-
DELETIONS=0
19+
EVENT_TYPE="${{ github.event_name }}"
20+
ACTION_TYPE="${{ github.event.action }}"
21+
22+
echo "Processing event: $EVENT_TYPE ($ACTION_TYPE)"
23+
24+
# 初始化默认值
25+
TITLE="📢 GitHub 通知"
26+
COLOR=3447003
27+
DESCRIPTION=""
28+
FIELDS=""
29+
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
30+
31+
# ------------------------------------------------------------------
32+
# 1. PUSH 事件处理
33+
# ------------------------------------------------------------------
34+
if [ "$EVENT_TYPE" == "push" ]; then
35+
TITLE="🚀 代码提交通知: ${{ github.repository }}"
36+
COLOR=3447003
37+
38+
# 尝试统计代码行数 (前提是 checkout depth >= 2)
39+
if git rev-parse HEAD~1 >/dev/null 2>&1; then
40+
CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD | wc -l | tr -d ' ')
41+
ADDITIONS=$(git diff --shortstat HEAD~1 HEAD | grep -oE '[0-9]+ insertion' | grep -oE '[0-9]+' || echo 0)
42+
DELETIONS=$(git diff --shortstat HEAD~1 HEAD | grep -oE '[0-9]+ deletion' | grep -oE '[0-9]+' || echo 0)
43+
else
44+
CHANGED_FILES="N/A"
45+
ADDITIONS="0"
46+
DELETIONS="0"
47+
fi
48+
49+
COMMIT_MSG=$(echo "${{ github.event.head_commit.message }}" | sed 's/"/\\"/g' | tr -d '\n')
50+
51+
# 构造 Fields
52+
FIELDS="[
53+
{\"name\": \"🌿 分支\", \"value\": \"${{ github.ref_name }}\", \"inline\": true},
54+
{\"name\": \"👤 提交者\", \"value\": \"${{ github.actor }}\", \"inline\": true},
55+
{\"name\": \"💬 提交信息\", \"value\": \"$COMMIT_MSG\", \"inline\": false},
56+
{\"name\": \"📊 变更文件\", \"value\": \"$CHANGED_FILES\", \"inline\": true},
57+
{\"name\": \"➕ 新增\", \"value\": \"$ADDITIONS\", \"inline\": true},
58+
{\"name\": \"➖ 删除\", \"value\": \"$DELETIONS\", \"inline\": true},
59+
{\"name\": \"🔗 Commit\", \"value\": \"[查看详情](${{ github.event.head_commit.url }})\", \"inline\": false}
60+
]"
61+
TIMESTAMP="${{ github.event.head_commit.timestamp }}"
62+
63+
# ------------------------------------------------------------------
64+
# 2. PULL REQUEST 事件处理 (Open / Reopen / Close / Merge)
65+
# ------------------------------------------------------------------
66+
elif [ "$EVENT_TYPE" == "pull_request" ]; then
67+
PR_TITLE=$(echo "${{ github.event.pull_request.title }}" | sed 's/"/\\"/g')
68+
PR_URL="${{ github.event.pull_request.html_url }}"
69+
PR_NUMBER="#${{ github.event.pull_request.number }}"
70+
PR_USER="${{ github.event.pull_request.user.login }}"
71+
BASE_REF="${{ github.event.pull_request.base.ref }}"
72+
HEAD_REF="${{ github.event.pull_request.head.ref }}"
73+
74+
if [ "$ACTION_TYPE" == "opened" ] || [ "$ACTION_TYPE" == "reopened" ]; then
75+
TITLE="🔀 新增 PR 待检视: $PR_NUMBER"
76+
COLOR=15105570 # Orange
77+
DESCRIPTION="**$PR_TITLE**"
78+
FIELDS="[
79+
{\"name\": \"👤 发起人\", \"value\": \"$PR_USER\", \"inline\": true},
80+
{\"name\": \"🎯 目标分支\", \"value\": \"$BASE_REF\", \"inline\": true},
81+
{\"name\": \"🌿 源分支\", \"value\": \"$HEAD_REF\", \"inline\": true},
82+
{\"name\": \"🔗 PR 链接\", \"value\": \"[查看详情]($PR_URL)\", \"inline\": false}
83+
]"
84+
85+
elif [ "$ACTION_TYPE" == "closed" ]; then
86+
if [ "${{ github.event.pull_request.merged }}" == "true" ]; then
87+
TITLE="✅ PR 已合并: $PR_NUMBER"
88+
COLOR=5763719 # Green
89+
DESCRIPTION="**$PR_TITLE**"
90+
FIELDS="[
91+
{\"name\": \"👤 合并者\", \"value\": \"${{ github.actor }}\", \"inline\": true},
92+
{\"name\": \"� 合入分支\", \"value\": \"$BASE_REF\", \"inline\": true},
93+
{\"name\": \"🔗 PR 链接\", \"value\": \"[查看详情]($PR_URL)\", \"inline\": false}
94+
]"
95+
else
96+
TITLE="⛔ PR 已关闭 (未合并): $PR_NUMBER"
97+
COLOR=15548997 # Red
98+
DESCRIPTION="**$PR_TITLE**"
99+
FIELDS="[
100+
{\"name\": \"👤 操作者\", \"value\": \"${{ github.actor }}\", \"inline\": true},
101+
{\"name\": \"� PR 链接\", \"value\": \"[查看详情]($PR_URL)\", \"inline\": false}
102+
]"
103+
fi
104+
fi
105+
106+
# ------------------------------------------------------------------
107+
# 3. RELEASE 事件处理
108+
# ------------------------------------------------------------------
109+
elif [ "$EVENT_TYPE" == "release" ] && [ "$ACTION_TYPE" == "published" ]; then
110+
TITLE="🎉 新版本发布: ${{ github.event.release.tag_name }}"
111+
COLOR=10181046 # Purple
112+
RELEASE_URL="${{ github.event.release.html_url }}"
113+
IS_PRERELEASE="${{ github.event.release.prerelease }}"
114+
115+
TYPE_TEXT="正式版"
116+
if [ "$IS_PRERELEASE" == "true" ]; then
117+
TYPE_TEXT="预发布版 (Pre-release)"
118+
fi
119+
120+
FIELDS="[
121+
{\"name\": \"📦 版本类型\", \"value\": \"$TYPE_TEXT\", \"inline\": true},
122+
{\"name\": \"👤 发布者\", \"value\": \"${{ github.actor }}\", \"inline\": true},
123+
{\"name\": \"🔗 Release 链接\", \"value\": \"[查看发行说明]($RELEASE_URL)\", \"inline\": false}
124+
]"
30125
fi
126+
127+
# ------------------------------------------------------------------
128+
# 4. 输出变量
129+
# ------------------------------------------------------------------
130+
# 处理可能为空的情况,保证 JSON 格式有效
131+
if [ -z "$FIELDS" ]; then FIELDS="[]"; fi
31132
32-
echo "files=$CHANGED_FILES" >> $GITHUB_OUTPUT
33-
echo "additions=$ADDITIONS" >> $GITHUB_OUTPUT
34-
echo "deletions=$DELETIONS" >> $GITHUB_OUTPUT
133+
echo "title=$TITLE" >> $GITHUB_OUTPUT
134+
echo "color=$COLOR" >> $GITHUB_OUTPUT
135+
echo "description=$DESCRIPTION" >> $GITHUB_OUTPUT
136+
echo "fields=$FIELDS" >> $GITHUB_OUTPUT
137+
echo "timestamp=$TIMESTAMP" >> $GITHUB_OUTPUT
35138
36139
- name: 发送 Discord 通知
37140
shell: bash
38141
env:
39142
DISCORD_WEBHOOK: ${{ inputs.webhook_url }}
40143
REPO_URL: "${{ github.server_url }}/${{ github.repository }}"
144+
TITLE: ${{ steps.info.outputs.title }}
145+
COLOR: ${{ steps.info.outputs.color }}
146+
DESCRIPTION: ${{ steps.info.outputs.description }}
147+
FIELDS: ${{ steps.info.outputs.fields }}
148+
TIMESTAMP: ${{ steps.info.outputs.timestamp }}
41149
run: |
150+
# 仅当有 Title 时才发送通知(过滤掉不支持的事件)
151+
if [ "$TITLE" == "📢 GitHub 通知" ] && [ "$FIELDS" == "[]" ]; then
152+
echo "No supported event detected, skipping notification."
153+
exit 0
154+
fi
155+
42156
# 构建 JSON Payload
43-
# 注意:Shell 变量和 GitHub Context 的混合使用
44-
45-
COMMIT_MSG=$(echo "${{ github.event.head_commit.message }}" | sed 's/"/\\"/g' | tr -d '\n')
46-
47-
curl -H "Content-Type: application/json" \
48-
-d "{
49-
\"embeds\": [{
50-
\"title\": \"🚀 代码提交通知: ${{ github.repository }}\",
51-
\"color\": 3447003,
52-
\"url\": \"$REPO_URL\",
53-
\"fields\": [
54-
{\"name\": \"📦 仓库地址\", \"value\": \"$REPO_URL\", \"inline\": false},
55-
{\"name\": \"🔗 Commit 链接\", \"value\": \"[点击查看](${{ github.event.head_commit.url }})\", \"inline\": false},
56-
{\"name\": \"🌿 分支\", \"value\": \"${{ github.ref_name }}\", \"inline\": true},
57-
{\"name\": \"👤 提交者\", \"value\": \"${{ github.actor }}\", \"inline\": true},
58-
{\"name\": \"💬 提交信息\", \"value\": \"$COMMIT_MSG\", \"inline\": false},
59-
{\"name\": \"📊 变更文件数\", \"value\": \"${{ steps.stats.outputs.files }}\", \"inline\": true},
60-
{\"name\": \"➕ 新增行数\", \"value\": \"${{ steps.stats.outputs.additions }}\", \"inline\": true},
61-
{\"name\": \"➖ 删除行数\", \"value\": \"${{ steps.stats.outputs.deletions }}\", \"inline\": true}
62-
],
63-
\"footer\": {
64-
\"text\": \"由 GitHub Actions 自动发送\",
65-
\"icon_url\": \"https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png\"
157+
# 注意:FIELDS 本身已经是 JSON 字符串,所以不能加引号
158+
JSON_PAYLOAD=$(cat <<EOF
159+
{
160+
"embeds": [{
161+
"title": "$TITLE",
162+
"color": $COLOR,
163+
"url": "$REPO_URL",
164+
"description": "$DESCRIPTION",
165+
"fields": $FIELDS,
166+
"footer": {
167+
"text": "由 GitHub Actions 自动发送",
168+
"icon_url": "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png"
66169
},
67-
\"timestamp\": \"${{ github.event.head_commit.timestamp }}\"
170+
"timestamp": "$TIMESTAMP"
68171
}]
69-
}" \
172+
}
173+
EOF
174+
)
175+
176+
curl -H "Content-Type: application/json" \
177+
-d "$JSON_PAYLOAD" \
70178
"$DISCORD_WEBHOOK"

docs/discord-notify.md

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
# Discord GitHub Notify Action
22

3-
这是一个用于发送 GitHub Push 事件通知到 Discord 的 Action。它会统计代码变更行数,并以中文格式展示详细信息。
3+
这是一个用于发送 GitHub 事件通知到 Discord 的 Action。支持 Push、Pull Request 和 Release 事件,并以中文格式展示详细信息。
44

55
## 功能特点
66

77
- 🇨🇳 **全中文界面**:友好的中文通知格式。
8-
- 📊 **代码统计**:自动计算新增、删除行数及变更文件数。
9-
- 🔗 **快速链接**:提供仓库、分支、Commit 的直接跳转链接。
8+
- 📊 **多事件支持**
9+
- **Push**: 代码提交统计(新增/删除行数)。
10+
- **Pull Request**: 新增 PR(待检视)、合并 PR、关闭 PR。
11+
- **Release**: 新版本发布通知。
12+
- 🔗 **快速链接**:提供仓库、PR、Commit、Release 的直接跳转链接。
1013

1114
## 输入参数 (Inputs)
1215

@@ -22,7 +25,13 @@
2225
```yaml
2326
name: Discord Notification
2427

25-
on: [push]
28+
on:
29+
push:
30+
branches: [ "**" ]
31+
pull_request:
32+
types: [opened, reopened, closed]
33+
release:
34+
types: [published]
2635

2736
jobs:
2837
notify:
@@ -31,24 +40,39 @@ jobs:
3140
- name: Checkout Code
3241
uses: actions/checkout@v4
3342
with:
34-
fetch-depth: 2 # 必须设置为 2 或 0,以便统计变更
43+
fetch-depth: 2 # 必须设置为 2 或 0,以便统计 Push 事件的变更
3544

3645
- name: Send Discord Notification
3746
uses: Time-Machine-Lab/TML-Github-Actions/actions/discord-github-notify@main
3847
with:
3948
webhook_url: ${{ secrets.DISCORD_WEBHOOK_URL }}
4049
```
4150
42-
## 注意事项
51+
## 支持的事件类型
4352
44-
1. **Checkout Depth**: 务必在 `actions/checkout` 中设置 `fetch-depth: 2`,否则无法计算代码变更统计(因为默认深度为 1,没有上一个 commit 的记录)。
45-
2. **Secrets**: 请在仓库 Settings -> Secrets and variables -> Actions 中添加 `DISCORD_WEBHOOK_URL`。
53+
该 Action 会根据触发的事件自动调整通知样式:
54+
55+
### 1. Push (代码提交)
56+
- **颜色**: 🔵 蓝色
57+
- **内容**: 分支、提交者、提交信息、代码变更统计(文件/新增/删除)。
58+
59+
### 2. Pull Request (代码合并请求)
60+
- **Open / Reopen**: 🟠 橙色
61+
- 标题: "🔀 新增 PR 待检视"
62+
- 内容: 发起人、源分支 -> 目标分支。
63+
- **Merged**: 🟢 绿色
64+
- 标题: "✅ PR 已合并"
65+
- 内容: 合并者、目标分支。
66+
- **Closed (未合并)**: 🔴 红色
67+
- 标题: "⛔ PR 已关闭"
68+
- 内容: 操作者。
4669
47-
## 效果预览
70+
### 3. Release (版本发布)
71+
- **Published**: 🟣 紫色
72+
- 标题: "🎉 新版本发布"
73+
- 内容: 版本号、版本类型(正式版/预发布版)、发行说明链接。
4874
49-
通知将包含以下信息:
50-
- 仓库名称及链接
51-
- 分支与提交者
52-
- 提交信息
53-
- 变更统计(文件数、新增、删除)
54-
- Commit 跳转链接
75+
## 注意事项
76+
77+
1. **Checkout Depth**: 务必在 `actions/checkout` 中设置 `fetch-depth: 2`,否则无法计算 Push 事件的代码变更统计。
78+
2. **Secrets**: 请在仓库 Settings -> Secrets and variables -> Actions 中添加 `DISCORD_WEBHOOK_URL`。

0 commit comments

Comments
 (0)