Skip to content

Commit 10885bf

Browse files
committed
ci(release): 🤖 添加发版工作流
1 parent 935f23c commit 10885bf

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed

.github/workflows/release.yml

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
name: Release
2+
3+
permissions:
4+
contents: write
5+
6+
on:
7+
push:
8+
tags:
9+
- 'v*'
10+
- '*@*'
11+
12+
jobs:
13+
build:
14+
name: 构建并发版
15+
runs-on: ubuntu-latest
16+
17+
steps:
18+
- name: 检出代码
19+
uses: actions/checkout@v4
20+
21+
- name: 获取当前和上一个标签
22+
id: get_tags
23+
run: |
24+
git fetch --prune --unshallow
25+
tags=($(git tag -l --sort=-version:refname))
26+
current_tag=${tags[0]}
27+
previous_tag=${tags[1]}
28+
echo "previous_tag=$previous_tag" >> $GITHUB_OUTPUT
29+
echo "current_tag=$current_tag" >> $GITHUB_OUTPUT
30+
31+
- name: 提取并分类提交消息
32+
id: extract_commit_messages
33+
run: |
34+
set -e
35+
current_tag="${{ steps.get_tags.outputs.current_tag }}"
36+
previous_tag="${{ steps.get_tags.outputs.previous_tag }}"
37+
if [ -z "$previous_tag" ]; then
38+
commit_messages=$(git log --pretty=format:"%s - by @%an (%h)" "$current_tag" | grep -E 'feat|fix|docs|perf' || true)
39+
else
40+
commit_messages=$(git log --pretty=format:"%s - by @%an (%h)" "$previous_tag".."$current_tag" | grep -E 'feat|fix|docs|perf' || true)
41+
fi
42+
43+
# 转义 ` 字符
44+
commit_messages=$(echo "$commit_messages" | sed 's/`/\\\`/g')
45+
46+
# feat_messages=$(echo "$commit_messages" | grep 'feat' || true)
47+
# fix_messages=$(echo "$commit_messages" | grep 'fix' || true)
48+
# docs_messages=$(echo "$commit_messages" | grep 'docs' || true)
49+
# perf_messages=$(echo "$commit_messages" | grep 'perf' || true)
50+
51+
# feat_messages=("${feat_messages[@]//\`/\\\`}")
52+
# fix_messages=("${fix_messages[@]//\`/\\\`}")
53+
# docs_messages=("${docs_messages[@]//\`/\\\`}")
54+
# perf_messages=("${perf_messages[@]//\`/\\\`}")
55+
56+
# echo "feat_messages=(${feat_messages[@]})" >> $GITHUB_OUTPUT
57+
# echo "fix_messages=(${fix_messages[@]})" >> $GITHUB_OUTPUT
58+
# echo "docs_messages=(${docs_messages[@]})" >> $GITHUB_OUTPUT
59+
# echo "perf_messages=(${perf_messages[@]})" >> $GITHUB_OUTPUT
60+
61+
{
62+
echo 'feat_messages<<EOF'
63+
echo "$commit_messages" | grep 'feat' || true
64+
echo 'EOF'
65+
} >> $GITHUB_OUTPUT
66+
{
67+
echo 'fix_messages<<EOF'
68+
echo "$commit_messages" | grep 'fix' || true
69+
echo 'EOF'
70+
} >> $GITHUB_OUTPUT
71+
{
72+
echo 'docs_messages<<EOF'
73+
echo "$commit_messages" | grep 'docs' || true
74+
echo 'EOF'
75+
} >> $GITHUB_OUTPUT
76+
{
77+
echo 'perf_messages<<EOF'
78+
echo "$commit_messages" | grep 'perf' || true
79+
echo 'EOF'
80+
} >> $GITHUB_OUTPUT
81+
82+
- name: 获取当前分支名
83+
id: get_branch_name
84+
run: |
85+
branch_name=$(git rev-parse --abbrev-ref HEAD)
86+
echo "branch_name=$branch_name" >> $GITHUB_OUTPUT
87+
88+
- name: 发版详情
89+
id: generate_release_notes
90+
run: |
91+
# 提取提交消息分类
92+
feat_messages=("${{ steps.extract_commit_messages.outputs.feat_messages }}")
93+
fix_messages=("${{ steps.extract_commit_messages.outputs.fix_messages }}")
94+
docs_messages=("${{ steps.extract_commit_messages.outputs.docs_messages }}")
95+
perf_messages=("${{ steps.extract_commit_messages.outputs.perf_messages }}")
96+
97+
release_notes=""
98+
99+
if [[ -n "$feat_messages" ]]; then
100+
release_notes="$release_notes\n### 🚀 Features 新功能: \n"
101+
while IFS= read -r message; do
102+
release_notes="$release_notes\n- $message"
103+
done <<< "$feat_messages"
104+
fi
105+
106+
if [[ -n "$fix_messages" ]]; then
107+
release_notes="$release_notes\n### 🩹 Fixes 缺陷修复: \n"
108+
while IFS= read -r message; do
109+
release_notes="$release_notes\n- $message"
110+
done <<< "$fix_messages"
111+
fi
112+
113+
if [[ -n "$docs_messages" ]]; then
114+
release_notes="$release_notes\n### 📖 Documentation 文档: \n"
115+
while IFS= read -r message; do
116+
release_notes="$release_notes\n- $message"
117+
done <<< "$docs_messages"
118+
fi
119+
120+
if [[ -n "$perf_messages" ]]; then
121+
release_notes="$release_notes\n### 🔥 Performance 性能优化: \n"
122+
while IFS= read -r message; do
123+
release_notes="$release_notes\n- $message"
124+
done <<< "$perf_messages"
125+
fi
126+
127+
# 转义 ` 字符
128+
release_notes=$(echo "$release_notes" | sed 's/`/\\\`/g')
129+
echo "release_notes=$release_notes" >> $GITHUB_OUTPUT
130+
131+
- name: 写入生成的发布说明到 changelog.md
132+
run: |
133+
echo -e "${{ steps.generate_release_notes.outputs.release_notes }}" > changelog.md
134+
cat changelog.md
135+
136+
- name: 引用 changelog.md 创建发版
137+
id: release_tag
138+
uses: ncipollo/release-action@v1.14.0
139+
with:
140+
bodyFile: changelog.md

0 commit comments

Comments
 (0)