Skip to content

Commit 9784242

Browse files
committed
chore: 更新 release.yml 工作流,调整 Node.js 版本设置,添加格式检查和构建步骤,优化版本发布逻辑
1 parent b8b719d commit 9784242

1 file changed

Lines changed: 41 additions & 166 deletions

File tree

.github/workflows/release.yml

Lines changed: 41 additions & 166 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ jobs:
2626
fetch-depth: 0
2727

2828
- name: 设置 Node.js
29-
uses: actions/setup-node@v5
29+
uses: actions/setup-node@v4
3030
with:
31-
node-version: '22'
31+
node-version: 22
3232
registry-url: 'https://registry.npmjs.org'
3333

3434
- name: 安装 pnpm
@@ -57,195 +57,70 @@ jobs:
5757
pnpm install --no-frozen-lockfile
5858
}
5959
60+
- name: 格式检查
61+
run: pnpm run lint
62+
63+
- name: 构建项目
64+
run: pnpm run build
65+
6066
- name: 获取版本号
6167
id: get_version
6268
run: |
6369
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
6470
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
6571
echo "tag_name=v${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
66-
echo "is_manual=true" >> $GITHUB_OUTPUT
6772
else
6873
echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
6974
echo "tag_name=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
70-
echo "is_manual=false" >> $GITHUB_OUTPUT
71-
fi
72-
73-
- name: 检查版本是否已存在
74-
id: check_version
75-
run: |
76-
VERSION=${{ steps.get_version.outputs.version }}
77-
78-
# 安全地获取包名和版本信息
79-
if ! PACKAGE_NAME=$(node -p "require('./package.json').name" 2>/dev/null); then
80-
echo "❌ 无法读取 package.json 中的包名"
81-
exit 1
82-
fi
83-
84-
if ! CURRENT_VERSION=$(node -p "require('./package.json').version" 2>/dev/null); then
85-
echo "❌ 无法读取 package.json 中的当前版本"
86-
exit 1
87-
fi
88-
89-
echo "🔍 检查版本信息:"
90-
echo " 目标版本: $VERSION"
91-
echo " 当前版本: $CURRENT_VERSION"
92-
echo " 包名: $PACKAGE_NAME"
93-
echo " 触发方式: ${{ github.event_name }}"
94-
95-
# 检查版本格式
96-
if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?$ ]]; then
97-
echo "❌ 版本格式不正确: $VERSION"
98-
echo "请使用语义化版本格式,例如: 1.0.0, 1.0.0-beta.1"
99-
exit 1
100-
fi
101-
102-
# 检查版本是否已在npm上发布
103-
echo "🔍 检查 npm 上的版本..."
104-
NPM_VERSION_OUTPUT=$(npm view "$PACKAGE_NAME@$VERSION" version 2>/dev/null || echo "NOT_FOUND")
105-
if [ "$NPM_VERSION_OUTPUT" != "NOT_FOUND" ] && [ -n "$NPM_VERSION_OUTPUT" ]; then
106-
echo "❌ 版本 $VERSION 已存在于 npm 上"
107-
echo "已发布的版本: $NPM_VERSION_OUTPUT"
108-
echo "请使用新的版本号重新发布"
109-
exit 1
110-
fi
111-
echo "✅ 版本 $VERSION 在 npm 上不存在,可以发布"
112-
113-
# 检查标签是否已存在
114-
echo "🔍 检查 git 标签..."
115-
if git tag -l | grep -q "^v$VERSION$"; then
116-
echo "❌ 标签 v$VERSION 已存在"
117-
echo "请使用新的版本号或删除已存在的标签"
118-
exit 1
11975
fi
120-
echo "✅ 标签 v$VERSION 不存在,可以创建"
121-
122-
# 对于手动触发,检查版本关系
123-
if [ "${{ steps.get_version.outputs.is_manual }}" = "true" ]; then
124-
echo "🔍 检查版本关系..."
125-
if [ "$VERSION" = "$CURRENT_VERSION" ]; then
126-
echo "❌ 新版本号不能与当前版本相同"
127-
echo "当前版本: $CURRENT_VERSION"
128-
echo "请使用更高的版本号"
129-
exit 1
130-
fi
131-
132-
# 使用 node 进行语义化版本比较
133-
VERSION_COMPARE=$(node -e "
134-
const semver = require('module').createRequire(import.meta.url)('./package.json').version;
135-
const target = '$VERSION';
136-
const current = '$CURRENT_VERSION';
137-
138-
function parseVersion(v) {
139-
const [main, pre] = v.split('-');
140-
const [major, minor, patch] = main.split('.').map(Number);
141-
return { major, minor, patch, pre: pre || null };
142-
}
143-
144-
function compareVersions(a, b) {
145-
const va = parseVersion(a);
146-
const vb = parseVersion(b);
147-
148-
if (va.major !== vb.major) return va.major - vb.major;
149-
if (va.minor !== vb.minor) return va.minor - vb.minor;
150-
if (va.patch !== vb.patch) return va.patch - vb.patch;
151-
152-
if (va.pre === null && vb.pre === null) return 0;
153-
if (va.pre === null) return 1;
154-
if (vb.pre === null) return -1;
155-
return va.pre.localeCompare(vb.pre);
156-
}
157-
158-
console.log(compareVersions(target, current));
159-
" 2>/dev/null || echo "0")
160-
161-
if [ "$VERSION_COMPARE" -le "0" ]; then
162-
echo "❌ 新版本号必须大于当前版本"
163-
echo "当前版本: $CURRENT_VERSION"
164-
echo "目标版本: $VERSION"
165-
echo "请使用更高的版本号"
166-
exit 1
167-
fi
168-
echo "✅ 版本号检查通过: $VERSION > $CURRENT_VERSION"
169-
fi
170-
171-
echo "✅ 版本 $VERSION 可以发布"
17276
17377
- name: 更新版本号 (手动触发时)
17478
if: github.event_name == 'workflow_dispatch'
17579
run: |
176-
VERSION=${{ steps.get_version.outputs.version }}
177-
echo "📝 更新 package.json 版本号到 $VERSION"
178-
179-
# 更新 package.json 版本号
180-
npm version $VERSION --no-git-tag-version
181-
182-
# 提交版本更新
183-
git config --local user.email "action@github.com"
184-
git config --local user.name "GitHub Action"
185-
git add package.json
186-
git commit -m "chore: bump version to $VERSION"
187-
188-
# 创建标签
189-
git tag ${{ steps.get_version.outputs.tag_name }}
190-
191-
echo "✅ 版本号已更新,标签已创建"
192-
193-
- name: 类型检查
194-
run: pnpm run type-check
195-
196-
- name: 运行测试
197-
run: pnpm run test
198-
199-
- name: 构建项目
200-
run: pnpm run build
201-
202-
- name: 包检查
203-
run: pnpm run lint:package
80+
# 检查 tag 是否已经存在
81+
if git show-ref --tags --verify --quiet "refs/tags/${{ steps.get_version.outputs.tag_name }}"; then
82+
echo "⚠️ Tag ${{ steps.get_version.outputs.tag_name }} 已存在,跳过创建"
83+
else
84+
npm version ${{ steps.get_version.outputs.version }} --no-git-tag-version
85+
git config --local user.email "action@github.com"
86+
git config --local user.name "GitHub Action"
87+
git add package.json
88+
git commit -m "chore: bump version to ${{ steps.get_version.outputs.version }}"
89+
git tag ${{ steps.get_version.outputs.tag_name }}
90+
git push origin HEAD:${{ github.ref_name }}
91+
git push origin ${{ steps.get_version.outputs.tag_name }}
92+
fi
20493
20594
- name: 生成变更日志
20695
id: changelog
96+
run: npx changelogithub
97+
continue-on-error: true
98+
env:
99+
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
100+
101+
- name: 发布到 npm
207102
run: |
208-
# 获取上一个标签
209-
PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
103+
# 检查版本是否已经发布到 npm
104+
PACKAGE_NAME=$(node -p "require('./package.json').name")
105+
CURRENT_VERSION=$(node -p "require('./package.json').version")
210106
211-
if [ -z "$PREV_TAG" ]; then
212-
# 如果没有上一个标签,获取所有提交
213-
CHANGELOG=$(git log --pretty=format:"- %s (%h)" --no-merges)
107+
# 尝试获取 npm 上的版本信息
108+
if npm view "${PACKAGE_NAME}@${CURRENT_VERSION}" version 2>/dev/null; then
109+
echo "⚠️ 版本 ${CURRENT_VERSION} 已存在于 npm,跳过发布"
214110
else
215-
# 获取两个标签之间的提交
216-
CHANGELOG=$(git log ${PREV_TAG}..HEAD --pretty=format:"- %s (%h)" --no-merges)
111+
echo "📦 发布版本 ${CURRENT_VERSION} 到 npm..."
112+
pnpm publish --no-git-checks
217113
fi
218-
219-
# 保存到文件以避免特殊字符问题
220-
echo "$CHANGELOG" > changelog.txt
221-
echo "changelog_file=changelog.txt" >> $GITHUB_OUTPUT
222-
223-
- name: 发布到 npm
224-
run: |
225-
echo "🚀 开始发布到 npm..."
226-
pnpm publish --no-git-checks
227-
echo "✅ npm 发布成功"
228114
env:
229115
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
230116

231-
- name: 推送更改和标签 (手动触发时)
232-
if: github.event_name == 'workflow_dispatch'
233-
run: |
234-
echo "📤 推送更改和标签..."
235-
git push origin HEAD:${{ github.ref_name }}
236-
git push origin ${{ steps.get_version.outputs.tag_name }}
237-
echo "✅ 推送完成"
238-
239-
- name: 创建 GitHub Release
240-
uses: actions/create-release@v1
241-
env:
242-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
117+
- name: Create GitHub Release
118+
uses: ncipollo/release-action@v1
243119
with:
244-
tag_name: ${{ steps.get_version.outputs.tag_name }}
245-
release_name: Release ${{ steps.get_version.outputs.tag_name }}
246-
body_path: ${{ steps.changelog.outputs.changelog_file }}
247-
draft: false
248-
prerelease: false
120+
generateReleaseNotes: "true"
121+
allowUpdates: true
122+
skipIfReleaseExists: false
123+
omitBodyDuringUpdate: false
249124

250125
- name: 通知发布成功
251126
run: |

0 commit comments

Comments
 (0)