-
Notifications
You must be signed in to change notification settings - Fork 35
290 lines (243 loc) · 12.1 KB
/
release.yml
File metadata and controls
290 lines (243 loc) · 12.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
name: Release Build and Publish
on:
workflow_dispatch:
inputs:
branch:
description: '构建分支'
required: true
default: 'springboot3'
type: choice
options:
- development
- springboot3
- master
is_prerelease:
description: '是否为预发布版本'
required: true
default: true
type: boolean
jobs:
build-and-release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
# 检出代码
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.branch }}
fetch-depth: 0 # 获取完整历史用于生成变更日志
# 设置 JDK 21 环境(用于后端 Spring Boot 3)
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: 'maven'
# 缓存 Maven 依赖
- name: Cache Maven dependencies
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
# 获取构建信息
- name: Get Build Information
id: build-info
run: |
VERSION=$(mvn help:evaluate -Dexpression=endless.version -q -DforceStdout)
BUILD_DATE=$(date '+%Y-%m-%d %H:%M:%S')
COMMIT_SHA=$(git rev-parse --short HEAD)
COMMIT_MSG=$(git log -1 --pretty=%B)
BRANCH="${{ github.event.inputs.branch }}"
IS_PRERELEASE="${{ github.event.inputs.is_prerelease }}"
if [ "$IS_PRERELEASE" = "true" ]; then
TAG="v${VERSION}-${BRANCH}-${COMMIT_SHA}"
RELEASE_TYPE="⚠️ 测试版 (Pre-release)"
else
# 正式版也加入提交哈希,避免重复发布同一版本号时冲突
TAG="v${VERSION}-${COMMIT_SHA}"
RELEASE_TYPE="✅ 正式版 (Stable)"
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "build_date=$BUILD_DATE" >> $GITHUB_OUTPUT
echo "commit_sha=$COMMIT_SHA" >> $GITHUB_OUTPUT
echo "tag=$TAG" >> $GITHUB_OUTPUT
echo "branch=$BRANCH" >> $GITHUB_OUTPUT
echo "is_prerelease=$IS_PRERELEASE" >> $GITHUB_OUTPUT
echo "release_type=$RELEASE_TYPE" >> $GITHUB_OUTPUT
# 转义提交信息中的特殊字符
COMMIT_MSG_ESCAPED=$(echo "$COMMIT_MSG" | head -n 1)
echo "commit_msg=$COMMIT_MSG_ESCAPED" >> $GITHUB_OUTPUT
# 生成变更日志
- name: Generate Changelog
id: changelog
run: |
# 获取最近的 tag
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -z "$LAST_TAG" ]; then
# 如果没有 tag,获取所有提交
CHANGELOG=$(git log --pretty=format:"- %s (%h)" --no-merges -10)
else
# 获取自上次 tag 以来的提交
CHANGELOG=$(git log ${LAST_TAG}..HEAD --pretty=format:"- %s (%h)" --no-merges)
fi
# 保存到文件
echo "$CHANGELOG" > changelog.txt
echo "Generated changelog with $(wc -l < changelog.txt) entries"
# 构建后端项目
- name: Build Backend Project
run: |
echo "Building Endless Manager..."
mvn -B clean package -DskipTests
# 复制并重命名 JAR 文件
cp endless-admin/target/endless-manager.jar \
endless-admin/target/endless-manager-springboot3-${{ steps.build-info.outputs.version }}.jar
# 显示构建信息
echo "✅ Backend build completed"
ls -lh endless-admin/target/*.jar
# 设置 Node.js 环境(用于前端)
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 16
# 安装前端依赖
- name: Install Frontend Dependencies
run: |
echo "Installing frontend dependencies..."
npm install
working-directory: ./endless-ui
# 构建前端项目
- name: Build Frontend Project
run: |
echo "Building frontend..."
npm run build:prod
echo "✅ Frontend build completed"
du -sh dist
working-directory: ./endless-ui
# 压缩前端产物
- name: Compress Frontend Dist
run: |
cd endless-ui
zip -r endless-ui-${{ steps.build-info.outputs.version }}.zip dist
echo "✅ Frontend compressed"
ls -lh endless-ui-*.zip
# 创建构建信息文件
- name: Create Build Info File
run: |
cat > build-info.txt << EOF
====================================
Endless Manager 构建信息
====================================
版本: ${{ steps.build-info.outputs.version }}
构建时间: ${{ steps.build-info.outputs.build_date }}
提交: ${{ steps.build-info.outputs.commit_sha }}
分支: ${{ steps.build-info.outputs.branch }}
发布类型: ${{ steps.build-info.outputs.release_type }}
Java 版本: 21
Node 版本: 16
构建者: GitHub Actions
====================================
EOF
cat build-info.txt
# 创建 Release(使用更现代的 action)
- name: Create Release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ steps.build-info.outputs.tag }}
name: "Endless Manager ${{ steps.build-info.outputs.version }} - ${{ steps.build-info.outputs.release_type }}"
body: |
## ${{ steps.build-info.outputs.release_type }}
${{ steps.build-info.outputs.is_prerelease == 'true' && '> ⚠️ **警告**: 这是一个测试版本,可能包含未经充分测试的功能和已知问题。不建议在生产环境中使用!' || '> ✅ 这是一个稳定的正式版本,已经过充分测试,可以在生产环境中使用。' }}
### 📌 版本信息
**基础版本**: `${{ steps.build-info.outputs.version }}`
**发布标签**: `${{ steps.build-info.outputs.tag }}`
> 💡 **版本号说明**: 标签使用短提交哈希(7位十六进制字符),确保每次构建都有唯一的版本号,避免重复发布。基础版本号保持不变,用于版本管理;完整标签用于 Git 标签和 Release 标识。
**构建时间**: ${{ steps.build-info.outputs.build_date }}
**提交**: [`${{ steps.build-info.outputs.commit_sha }}`](https://github.com/${{ github.repository }}/commit/${{ github.sha }})
**分支**: `${{ steps.build-info.outputs.branch }}`
**发布类型**: ${{ steps.build-info.outputs.release_type }}
### 📦 下载说明
#### 后端 (Spring Boot 3)
- **文件**: `endless-manager-springboot3-${{ steps.build-info.outputs.version }}.jar`
- **要求**: Java 21+
- **说明**: 基于 Spring Boot 3 的后端服务
#### 前端
- **文件**: `endless-ui-${{ steps.build-info.outputs.version }}.zip`
- **说明**: 前端静态资源,解压后部署到 Web 服务器
### 🔧 部署步骤
#### 后端部署
```bash
# 1. 下载 JAR 文件
# 2. 配置 application.yml
# 3. 启动服务(需要 Java 21)
java -jar endless-manager-springboot3-${{ steps.build-info.outputs.version }}.jar
```
#### 前端部署
```bash
# 1. 下载并解压 endless-ui.zip
unzip endless-ui-${{ steps.build-info.outputs.version }}.zip
# 2. 将 dist 目录内容部署到 Nginx/Apache
```
### 📝 最近更新
**最新提交**: ${{ steps.build-info.outputs.commit_msg }}
<details>
<summary>查看完整变更日志</summary>
$(cat changelog.txt)
</details>
### 🔗 相关链接
- [📖 文档](https://github.com/${{ github.repository }}/blob/${{ steps.build-info.outputs.branch }}/README.md)
- [🐛 问题反馈](https://github.com/${{ github.repository }}/issues)
- [💬 讨论区](https://github.com/${{ github.repository }}/discussions)
- [📋 提交历史](https://github.com/${{ github.repository }}/commits/${{ steps.build-info.outputs.branch }})
### ⚠️ 注意事项
- 此版本基于 Spring Boot 3,需要 Java 21 或更高版本
- 首次部署请参考配置文档进行数据库初始化
${{ steps.build-info.outputs.is_prerelease == 'true' && '- **测试版警告**: 此版本仅供测试使用,可能存在严重 bug,请勿在生产环境部署' || '- 建议在生产环境部署前先在测试环境验证' }}
${{ steps.build-info.outputs.branch == 'development' && '- **开发分支**: 此版本来自开发分支,功能可能不稳定' || '' }}
---
> 🤖 此版本由 GitHub Actions 手动触发构建和发布
> 📅 构建时间: ${{ steps.build-info.outputs.build_date }}
> 🏷️ 构建分支: ${{ steps.build-info.outputs.branch }}
files: |
endless-admin/target/endless-manager-springboot3-${{ steps.build-info.outputs.version }}.jar
endless-ui/endless-ui-${{ steps.build-info.outputs.version }}.zip
build-info.txt
draft: false
prerelease: ${{ steps.build-info.outputs.is_prerelease == 'true' }}
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# 构建成功通知
- name: Build Success Summary
if: success()
run: |
echo "## ✅ 构建成功!" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**版本**: ${{ steps.build-info.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "**Tag**: ${{ steps.build-info.outputs.tag }}" >> $GITHUB_STEP_SUMMARY
echo "**分支**: ${{ steps.build-info.outputs.branch }}" >> $GITHUB_STEP_SUMMARY
echo "**发布类型**: ${{ steps.build-info.outputs.release_type }}" >> $GITHUB_STEP_SUMMARY
echo "**构建时间**: ${{ steps.build-info.outputs.build_date }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [ "${{ steps.build-info.outputs.is_prerelease }}" = "true" ]; then
echo "### ⚠️ 测试版警告" >> $GITHUB_STEP_SUMMARY
echo "此版本标记为预发布版本,仅供测试使用!" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
fi
echo "### 📦 产物" >> $GITHUB_STEP_SUMMARY
echo "- Backend JAR: endless-manager-springboot3-${{ steps.build-info.outputs.version }}.jar" >> $GITHUB_STEP_SUMMARY
echo "- Frontend ZIP: endless-ui-${{ steps.build-info.outputs.version }}.zip" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "🔗 [查看 Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.build-info.outputs.tag }})" >> $GITHUB_STEP_SUMMARY
# 构建失败通知
- name: Build Failure Summary
if: failure()
run: |
echo "## ❌ 构建失败" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**版本**: ${{ steps.build-info.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "**提交**: ${{ steps.build-info.outputs.commit_sha }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "请检查构建日志以获取详细错误信息。" >> $GITHUB_STEP_SUMMARY