Skip to content

Commit 44623df

Browse files
committed
chore: 更新发布工作流,增强版本检查逻辑,确保包名和版本信息安全获取,并添加语义化版本比较
1 parent 8e4062a commit 44623df

1 file changed

Lines changed: 58 additions & 4 deletions

File tree

.github/workflows/release.yml

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,17 @@ jobs:
7474
id: check_version
7575
run: |
7676
VERSION=${{ steps.get_version.outputs.version }}
77-
PACKAGE_NAME=$(node -p "require('./package.json').name")
78-
CURRENT_VERSION=$(node -p "require('./package.json').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
7988
8089
echo "🔍 检查版本信息:"
8190
echo " 目标版本: $VERSION"
@@ -91,27 +100,72 @@ jobs:
91100
fi
92101
93102
# 检查版本是否已在npm上发布
94-
if npm view "$PACKAGE_NAME@$VERSION" version 2>/dev/null; then
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
95106
echo "❌ 版本 $VERSION 已存在于 npm 上"
107+
echo "已发布的版本: $NPM_VERSION_OUTPUT"
96108
echo "请使用新的版本号重新发布"
97109
exit 1
98110
fi
111+
echo "✅ 版本 $VERSION 在 npm 上不存在,可以发布"
99112
100113
# 检查标签是否已存在
114+
echo "🔍 检查 git 标签..."
101115
if git tag -l | grep -q "^v$VERSION$"; then
102116
echo "❌ 标签 v$VERSION 已存在"
103117
echo "请使用新的版本号或删除已存在的标签"
104118
exit 1
105119
fi
120+
echo "✅ 标签 v$VERSION 不存在,可以创建"
106121
107-
# 对于手动触发,检查版本是否大于当前版本
122+
# 对于手动触发,检查版本关系
108123
if [ "${{ steps.get_version.outputs.is_manual }}" = "true" ]; then
124+
echo "🔍 检查版本关系..."
109125
if [ "$VERSION" = "$CURRENT_VERSION" ]; then
110126
echo "❌ 新版本号不能与当前版本相同"
111127
echo "当前版本: $CURRENT_VERSION"
112128
echo "请使用更高的版本号"
113129
exit 1
114130
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"
115169
fi
116170
117171
echo "✅ 版本 $VERSION 可以发布"

0 commit comments

Comments
 (0)