|
26 | 26 | fetch-depth: 0 |
27 | 27 |
|
28 | 28 | - name: 设置 Node.js |
29 | | - uses: actions/setup-node@v5 |
| 29 | + uses: actions/setup-node@v4 |
30 | 30 | with: |
31 | | - node-version: '22' |
| 31 | + node-version: 22 |
32 | 32 | registry-url: 'https://registry.npmjs.org' |
33 | 33 |
|
34 | 34 | - name: 安装 pnpm |
@@ -57,195 +57,70 @@ jobs: |
57 | 57 | pnpm install --no-frozen-lockfile |
58 | 58 | } |
59 | 59 |
|
| 60 | + - name: 格式检查 |
| 61 | + run: pnpm run lint |
| 62 | + |
| 63 | + - name: 构建项目 |
| 64 | + run: pnpm run build |
| 65 | + |
60 | 66 | - name: 获取版本号 |
61 | 67 | id: get_version |
62 | 68 | run: | |
63 | 69 | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then |
64 | 70 | echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT |
65 | 71 | echo "tag_name=v${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT |
66 | | - echo "is_manual=true" >> $GITHUB_OUTPUT |
67 | 72 | else |
68 | 73 | echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT |
69 | 74 | 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 |
119 | 75 | 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 可以发布" |
172 | 76 |
|
173 | 77 | - name: 更新版本号 (手动触发时) |
174 | 78 | if: github.event_name == 'workflow_dispatch' |
175 | 79 | 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 |
204 | 93 |
|
205 | 94 | - name: 生成变更日志 |
206 | 95 | id: changelog |
| 96 | + run: npx changelogithub |
| 97 | + continue-on-error: true |
| 98 | + env: |
| 99 | + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} |
| 100 | + |
| 101 | + - name: 发布到 npm |
207 | 102 | 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") |
210 | 106 | |
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,跳过发布" |
214 | 110 | 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 |
217 | 113 | 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 发布成功" |
228 | 114 | env: |
229 | 115 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} |
230 | 116 |
|
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 |
243 | 119 | 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 |
249 | 124 |
|
250 | 125 | - name: 通知发布成功 |
251 | 126 | run: | |
|
0 commit comments