11name : ' Discord 通知 (中文版)'
2- description : ' 发送包含 Git 提交统计信息的 Discord 通知,支持中文展示'
2+ description : ' 发送 Git 提交、PR 变更或 Release 发布的 Discord 通知,支持中文展示'
33inputs :
44 webhook_url :
55 description : ' Discord Webhook URL'
@@ -12,59 +12,167 @@ inputs:
1212runs :
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"
0 commit comments