Skip to content

Commit ea31eab

Browse files
committed
chore: 🤖 调整ci发布配置
1 parent c9e3843 commit ea31eab

2 files changed

Lines changed: 293 additions & 19 deletions

File tree

.github/RELEASE_GUIDE.md

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
# 📦 发布指南
2+
3+
## 🔧 优化后的工作流特性
4+
5+
我们已经完全重新设计了发布工作流,彻底解决了重复发布问题:
6+
7+
### ✅ 解决的问题
8+
1. **循环触发**:避免手动触发导致的重复执行
9+
2. **版本冲突**:多重检查确保版本唯一性
10+
3. **时序错误**:优化步骤顺序避免部分失败
11+
4. **版本验证**:严格的版本格式和逻辑检查
12+
13+
### 🚀 新功能
14+
- **智能版本检查**:自动检查 npm、Git 标签和版本格式
15+
- **防重复机制**:避免标签推送导致的循环触发
16+
- **详细日志**:清晰的执行状态和错误信息
17+
- **安全发布**:先验证再发布的安全流程
18+
19+
## 📋 使用方法
20+
21+
### 方法一:手动触发发布(推荐)
22+
23+
1. **进入 GitHub Actions 页面**
24+
- 打开你的仓库
25+
- 点击 "Actions" 标签
26+
- 选择 "Release" 工作流
27+
28+
2. **点击 "Run workflow"**
29+
- 选择分支(通常是 main)
30+
- 输入版本号(如 `2.0.9`
31+
- 点击 "Run workflow"
32+
33+
3. **工作流会自动完成**
34+
- 检查版本是否可用
35+
- 更新 `package.json` 版本号
36+
- 运行测试和构建
37+
- 发布到 npm
38+
- 推送更改和标签
39+
- 创建 GitHub Release
40+
41+
### 方法二:标签触发发布
42+
43+
1. **本地更新版本**
44+
```bash
45+
# 更新到补丁版本
46+
npm version patch
47+
48+
# 或者指定版本
49+
npm version 2.0.9 --no-git-tag-version
50+
git add package.json
51+
git commit -m "chore: bump version to 2.0.9"
52+
git tag v2.0.9
53+
```
54+
55+
2. **推送标签**
56+
```bash
57+
git push origin main
58+
git push origin v2.0.9
59+
```
60+
61+
3. **工作流自动执行**
62+
- 检查版本是否可用
63+
- 运行测试和构建
64+
- 发布到 npm
65+
- 创建 GitHub Release
66+
67+
## ⚠️ 解决当前版本问题
68+
69+
### 问题:当前版本 2.0.8 已存在
70+
71+
你的 `package.json` 中版本是 `2.0.8`,这个版本已经在 npm 上发布过了。
72+
73+
### 解决方案:
74+
75+
**选项 1:快速更新到 2.0.9**
76+
```bash
77+
npm version 2.0.9 --no-git-tag-version
78+
git add package.json
79+
git commit -m "chore: bump version to 2.0.9"
80+
git push origin main
81+
```
82+
83+
**选项 2:使用项目的 release 脚本**
84+
```bash
85+
pnpm run release
86+
```
87+
88+
**选项 3:手动编辑 package.json**
89+
```json
90+
{
91+
"version": "2.0.9"
92+
}
93+
```
94+
95+
## 📊 版本策略
96+
97+
### 语义化版本规则
98+
- **补丁版本** (x.x.X):修复 bug
99+
- **次版本** (x.X.x):新功能,向后兼容
100+
- **主版本** (X.x.x):破坏性更改
101+
102+
### 版本示例
103+
```
104+
当前版本: 2.0.8
105+
下一个补丁版本: 2.0.9
106+
下一个次版本: 2.1.0
107+
下一个主版本: 3.0.0
108+
```
109+
110+
### 预发布版本
111+
```
112+
Beta 版本: 2.1.0-beta.1
113+
RC 版本: 2.1.0-rc.1
114+
```
115+
116+
## 🔍 工作流检查项
117+
118+
### 版本检查
119+
- ✅ 版本格式符合语义化版本规范
120+
- ✅ 版本在 npm 上不存在
121+
- ✅ Git 标签不存在
122+
- ✅ 新版本号不等于当前版本
123+
124+
### 发布检查
125+
- ✅ 类型检查通过
126+
- ✅ 单元测试通过
127+
- ✅ 构建成功
128+
- ✅ 包检查通过
129+
- ✅ npm 发布成功
130+
- ✅ GitHub Release 创建成功
131+
132+
## 🚨 错误处理
133+
134+
### 常见错误及解决方案
135+
136+
**错误:版本已存在**
137+
```
138+
❌ 版本 2.0.8 已存在于 npm 上
139+
```
140+
**解决**:使用更高的版本号
141+
142+
**错误:版本格式不正确**
143+
```
144+
❌ 版本格式不正确: 2.0.8.1
145+
```
146+
**解决**:使用语义化版本格式 (如 2.0.9)
147+
148+
**错误:标签已存在**
149+
```
150+
❌ 标签 v2.0.8 已存在
151+
```
152+
**解决**:使用新的版本号或删除已存在的标签
153+
154+
**错误:版本号相同**
155+
```
156+
❌ 新版本号不能与当前版本相同
157+
```
158+
**解决**:使用更高的版本号
159+
160+
## 🔧 调试工具
161+
162+
### 检查当前状态
163+
```bash
164+
# 查看当前版本
165+
npm version
166+
167+
# 查看已发布版本
168+
npm view @winner-fed/cloud-utils versions --json
169+
170+
# 查看 Git 标签
171+
git tag -l --sort=-version:refname | head -10
172+
173+
# 检查工作流状态
174+
gh run list --workflow=release.yml
175+
```
176+
177+
### 清理命令
178+
```bash
179+
# 删除本地标签
180+
git tag -d v2.0.8
181+
182+
# 删除远程标签(谨慎使用)
183+
git push origin :refs/tags/v2.0.8
184+
```
185+
186+
## 📝 最佳实践
187+
188+
### 发布前检查
189+
1. 确保所有测试通过
190+
2. 检查版本号是否正确
191+
3. 确认变更日志更新
192+
4. 验证构建无错误
193+
194+
### 发布流程
195+
1. 使用手动触发方式(更安全)
196+
2. 先发布到测试环境验证
197+
3. 监控工作流执行状态
198+
4. 验证 npm 包是否正确发布
199+
200+
### 回滚策略
201+
如果发布出现问题:
202+
1. 不要删除已发布的 npm 版本
203+
2. 立即发布修复版本
204+
3. 在 GitHub Release 中标记问题
205+
206+
## 🎯 下一步行动
207+
208+
1. **解决当前版本问题**:将版本从 2.0.8 更新到 2.0.9
209+
2. **测试新工作流**:使用手动触发进行一次测试发布
210+
3. **验证效果**:确认不再出现重复发布问题
211+
212+
## 🆘 获取帮助
213+
214+
如果遇到问题:
215+
1. 查看 GitHub Actions 日志
216+
2. 检查 npm 包状态
217+
3. 验证版本号和标签
218+
4. 参考错误信息和解决方案
219+
220+
---
221+
222+
**📌 记住:新的工作流已经解决了重复发布问题,现在你可以放心使用手动触发功能!**

.github/workflows/release.yml

Lines changed: 71 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -57,55 +57,96 @@ jobs:
5757
pnpm install --no-frozen-lockfile
5858
}
5959
60-
- name: 类型检查
61-
run: pnpm run type-check
62-
63-
- name: 运行测试
64-
run: pnpm run test
65-
66-
- name: 构建项目
67-
run: pnpm run build
68-
69-
- name: 包检查
70-
run: pnpm run lint:package
71-
7260
- name: 获取版本号
7361
id: get_version
7462
run: |
7563
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
7664
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
7765
echo "tag_name=v${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
66+
echo "is_manual=true" >> $GITHUB_OUTPUT
7867
else
7968
echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
8069
echo "tag_name=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
70+
echo "is_manual=false" >> $GITHUB_OUTPUT
8171
fi
8272
8373
- name: 检查版本是否已存在
8474
id: check_version
8575
run: |
8676
VERSION=${{ steps.get_version.outputs.version }}
8777
PACKAGE_NAME=$(node -p "require('./package.json').name")
78+
CURRENT_VERSION=$(node -p "require('./package.json').version")
79+
80+
echo "🔍 检查版本信息:"
81+
echo " 目标版本: $VERSION"
82+
echo " 当前版本: $CURRENT_VERSION"
83+
echo " 包名: $PACKAGE_NAME"
84+
echo " 触发方式: ${{ github.event_name }}"
85+
86+
# 检查版本格式
87+
if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?$ ]]; then
88+
echo "❌ 版本格式不正确: $VERSION"
89+
echo "请使用语义化版本格式,例如: 1.0.0, 1.0.0-beta.1"
90+
exit 1
91+
fi
8892
8993
# 检查版本是否已在npm上发布
9094
if npm view "$PACKAGE_NAME@$VERSION" version 2>/dev/null; then
9195
echo "❌ 版本 $VERSION 已存在于 npm 上"
9296
echo "请使用新的版本号重新发布"
9397
exit 1
94-
else
95-
echo "✅ 版本 $VERSION 可以发布"
9698
fi
99+
100+
# 检查标签是否已存在
101+
if git tag -l | grep -q "^v$VERSION$"; then
102+
echo "❌ 标签 v$VERSION 已存在"
103+
echo "请使用新的版本号或删除已存在的标签"
104+
exit 1
105+
fi
106+
107+
# 对于手动触发,检查版本是否大于当前版本
108+
if [ "${{ steps.get_version.outputs.is_manual }}" = "true" ]; then
109+
if [ "$VERSION" = "$CURRENT_VERSION" ]; then
110+
echo "❌ 新版本号不能与当前版本相同"
111+
echo "当前版本: $CURRENT_VERSION"
112+
echo "请使用更高的版本号"
113+
exit 1
114+
fi
115+
fi
116+
117+
echo "✅ 版本 $VERSION 可以发布"
97118
98119
- name: 更新版本号 (手动触发时)
99120
if: github.event_name == 'workflow_dispatch'
100121
run: |
101-
npm version ${{ steps.get_version.outputs.version }} --no-git-tag-version
122+
VERSION=${{ steps.get_version.outputs.version }}
123+
echo "📝 更新 package.json 版本号到 $VERSION"
124+
125+
# 更新 package.json 版本号
126+
npm version $VERSION --no-git-tag-version
127+
128+
# 提交版本更新
102129
git config --local user.email "action@github.com"
103130
git config --local user.name "GitHub Action"
104131
git add package.json
105-
git commit -m "chore: bump version to ${{ steps.get_version.outputs.version }}"
132+
git commit -m "chore: bump version to $VERSION"
133+
134+
# 创建标签
106135
git tag ${{ steps.get_version.outputs.tag_name }}
107-
git push origin HEAD:${{ github.ref_name }}
108-
git push origin ${{ steps.get_version.outputs.tag_name }}
136+
137+
echo "✅ 版本号已更新,标签已创建"
138+
139+
- name: 类型检查
140+
run: pnpm run type-check
141+
142+
- name: 运行测试
143+
run: pnpm run test
144+
145+
- name: 构建项目
146+
run: pnpm run build
147+
148+
- name: 包检查
149+
run: pnpm run lint:package
109150

110151
- name: 生成变更日志
111152
id: changelog
@@ -126,10 +167,21 @@ jobs:
126167
echo "changelog_file=changelog.txt" >> $GITHUB_OUTPUT
127168
128169
- name: 发布到 npm
129-
run: pnpm publish --no-git-checks
170+
run: |
171+
echo "🚀 开始发布到 npm..."
172+
pnpm publish --no-git-checks
173+
echo "✅ npm 发布成功"
130174
env:
131175
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
132176

177+
- name: 推送更改和标签 (手动触发时)
178+
if: github.event_name == 'workflow_dispatch'
179+
run: |
180+
echo "📤 推送更改和标签..."
181+
git push origin HEAD:${{ github.ref_name }}
182+
git push origin ${{ steps.get_version.outputs.tag_name }}
183+
echo "✅ 推送完成"
184+
133185
- name: 创建 GitHub Release
134186
uses: actions/create-release@v1
135187
env:

0 commit comments

Comments
 (0)