1- name : Release
1+ name : Release - Parallel Publishing
22
33on :
44 release :
55 types : [published]
6+ push :
7+ tags :
8+ - ' v*' # 支持以 v 开头的版本标签 (如 v1.0.5)
69
710jobs :
8- publish :
11+ # 🔧 构建阶段 - 创建共享的VSIX文件
12+ build :
913 runs-on : ubuntu-latest
10- permissions :
11- contents : write # 允许上传文件到 Release
12- actions : read # 允许读取 Actions 信息
14+ outputs :
15+ package_name : ${{ steps.package.outputs.package_name }}
16+ version : ${{ steps.package.outputs.version }}
17+ tag_name : ${{ steps.tag-info.outputs.tag_name }}
18+ is_tag_push : ${{ steps.tag-info.outputs.is_tag_push }}
1319 steps :
1420 - name : Checkout code
1521 uses : actions/checkout@v4
1622 with :
1723 submodules : recursive
1824
25+ - name : Detect trigger type and extract tag info
26+ id : tag-info
27+ run : |
28+ if [ "${{ github.event_name }}" == "release" ]; then
29+ # Release触发
30+ echo "is_tag_push=false" >> $GITHUB_OUTPUT
31+ echo "tag_name=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT
32+ echo "🎉 由 GitHub Release 触发: ${{ github.event.release.tag_name }}"
33+ elif [ "${{ github.event_name }}" == "push" ] && [[ "${{ github.ref }}" == refs/tags/* ]]; then
34+ # Tag推送触发
35+ echo "is_tag_push=true" >> $GITHUB_OUTPUT
36+ TAG_NAME=${GITHUB_REF#refs/tags/}
37+ echo "tag_name=${TAG_NAME}" >> $GITHUB_OUTPUT
38+ echo "🏷️ 由 Tag 推送触发: ${TAG_NAME}"
39+ else
40+ echo "❌ 未知的触发方式"
41+ exit 1
42+ fi
43+
1944 - name : Setup Node.js
2045 uses : actions/setup-node@v4
2146 with :
@@ -37,19 +62,177 @@ jobs:
3762 npx @vscode/vsce package --out "${PACKAGE_NAME}"
3863 echo "package_name=${PACKAGE_NAME}" >> $GITHUB_OUTPUT
3964 echo "version=${VERSION}" >> $GITHUB_OUTPUT
65+ echo "✅ 扩展打包完成: ${PACKAGE_NAME}"
66+
67+ - name : Upload VSIX artifact
68+ uses : actions/upload-artifact@v4
69+ with :
70+ name : extension-package
71+ path : ${{ steps.package.outputs.package_name }}
72+ retention-days : 7
73+
74+ # 🚀 VSCode Marketplace 发布(并行任务1)
75+ publish-vscode :
76+ needs : build
77+ runs-on : ubuntu-latest
78+ continue-on-error : true # 容错机制:此任务失败不影响整个工作流
79+ steps :
80+ - name : Download VSIX artifact
81+ uses : actions/download-artifact@v4
82+ with :
83+ name : extension-package
4084
4185 - name : Publish to VSCode Marketplace
4286 env :
4387 VSCE_PAT : ${{ secrets.VSCE_PAT }}
44- run : npx @vscode/vsce publish --packagePath ${{ steps.package.outputs.package_name }}
88+ run : |
89+ # 检查是否有发布令牌
90+ if [ -z "$VSCE_PAT" ]; then
91+ echo "⚠️ VSCE_PAT 未设置,跳过 VSCode Marketplace 发布"
92+ exit 0
93+ fi
94+
95+ echo "🚀 发布到 VSCode Marketplace..."
96+ npx @vscode/vsce publish --packagePath ${{ needs.build.outputs.package_name }}
97+ echo "✅ VSCode Marketplace 发布成功"
98+ continue-on-error : true
99+
100+ - name : Report VSCode publish result
101+ if : always()
102+ run : |
103+ if [ ${{ job.status }} == 'success' ]; then
104+ echo "✅ VSCode Marketplace 发布:成功"
105+ else
106+ echo "❌ VSCode Marketplace 发布:失败"
107+ fi
108+
109+ # 📦 OpenVSX Registry 发布(并行任务2)
110+ publish-openvsx :
111+ needs : build
112+ runs-on : ubuntu-latest
113+ continue-on-error : true # 容错机制:此任务失败不影响整个工作流
114+ steps :
115+ - name : Download VSIX artifact
116+ uses : actions/download-artifact@v4
117+ with :
118+ name : extension-package
45119
46120 - name : Publish to OpenVSX Registry
47121 env :
48122 OVSX_PAT : ${{ secrets.OVSX_PAT }}
49- run : npx ovsx publish ${{ steps.package.outputs.package_name }} --pat $OVSX_PAT
123+ run : |
124+ # 检查是否有发布令牌
125+ if [ -z "$OVSX_PAT" ]; then
126+ echo "⚠️ OVSX_PAT 未设置,跳过 OpenVSX Registry 发布"
127+ exit 0
128+ fi
129+
130+ echo "🚀 发布到 OpenVSX Registry..."
131+ npx ovsx publish ${{ needs.build.outputs.package_name }} --pat $OVSX_PAT
132+ echo "✅ OpenVSX Registry 发布成功"
133+ continue-on-error : true
134+
135+ - name : Report OpenVSX publish result
136+ if : always()
137+ run : |
138+ if [ ${{ job.status }} == 'success' ]; then
139+ echo "✅ OpenVSX Registry 发布:成功"
140+ else
141+ echo "❌ OpenVSX Registry 发布:失败"
142+ fi
143+
144+ # 📎 GitHub Release 上传(并行任务3)
145+ upload-github-release :
146+ needs : build
147+ runs-on : ubuntu-latest
148+ continue-on-error : true # 容错机制:此任务失败不影响整个工作流
149+ permissions :
150+ contents : write # 允许上传文件到 Release
151+ steps :
152+ - name : Download VSIX artifact
153+ uses : actions/download-artifact@v4
154+ with :
155+ name : extension-package
50156
51- - name : Upload VSIX to release
157+ - name : Upload VSIX to GitHub Release
52158 run : |
53- gh release upload ${{ github.event.release.tag_name }} "${{ steps.package.outputs.package_name }}" --clobber
159+ echo "🚀 处理 GitHub Release..."
160+ TAG_NAME="${{ needs.build.outputs.tag_name }}"
161+ PACKAGE_NAME="${{ needs.build.outputs.package_name }}"
162+
163+ if [ "${{ needs.build.outputs.is_tag_push }}" == "true" ]; then
164+ # Tag推送触发:创建或更新Release
165+ echo "📝 为 Tag ${TAG_NAME} 创建/更新 Release..."
166+
167+ # 检查Release是否已存在
168+ if gh release view "${TAG_NAME}" >/dev/null 2>&1; then
169+ echo "🔄 Release ${TAG_NAME} 已存在,上传文件..."
170+ gh release upload "${TAG_NAME}" "${PACKAGE_NAME}" --clobber
171+ else
172+ echo "🆕 创建新的 Release ${TAG_NAME}..."
173+
174+ # 获取 Tag annotation 作为 Release Notes
175+ TAG_MESSAGE=$(git tag -l --format='%(contents)' "${TAG_NAME}" 2>/dev/null || echo "")
176+
177+ if [ -n "$TAG_MESSAGE" ] && [ "$TAG_MESSAGE" != "" ]; then
178+ echo "📝 使用 Tag annotation 作为 Release Notes"
179+ gh release create "${TAG_NAME}" "${PACKAGE_NAME}" --title "API Navigator ${TAG_NAME}" --notes "$TAG_MESSAGE"
180+ else
181+ echo "📝 使用默认 Release Notes"
182+ gh release create "${TAG_NAME}" "${PACKAGE_NAME}" --title "API Navigator ${TAG_NAME}" --notes "🚀 API Navigator ${TAG_NAME} 自动发布。VSCode Marketplace 和 OpenVSX Registry 同步发布中,请访问 GitHub 仓库查看详细信息。"
183+ fi
184+ fi
185+ else
186+ # Release触发:直接上传文件
187+ echo "📎 上传文件到现有 Release ${TAG_NAME}..."
188+ gh release upload "${TAG_NAME}" "${PACKAGE_NAME}" --clobber
189+ fi
190+
191+ echo "✅ GitHub Release 处理成功"
54192 env :
55193 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
194+ continue-on-error : true
195+
196+ - name : Report GitHub upload result
197+ if : always()
198+ run : |
199+ if [ ${{ job.status }} == 'success' ]; then
200+ echo "✅ GitHub Release 上传:成功"
201+ else
202+ echo "❌ GitHub Release 上传:失败"
203+ fi
204+
205+ # 📊 发布状态汇总(最终状态报告)
206+ publish-summary :
207+ needs : [build, publish-vscode, publish-openvsx, upload-github-release]
208+ runs-on : ubuntu-latest
209+ if : always() # 始终运行,即使前面的任务失败
210+ steps :
211+ - name : Publish Summary Report
212+ run : |
213+ echo "📋 发布状态汇总报告"
214+ echo "===================="
215+ echo "🔧 构建状态: ${{ needs.build.result }}"
216+ echo "🚀 VSCode Marketplace: ${{ needs.publish-vscode.result }}"
217+ echo "📦 OpenVSX Registry: ${{ needs.publish-openvsx.result }}"
218+ echo "📎 GitHub Release: ${{ needs.upload-github-release.result }}"
219+ echo "===================="
220+
221+ # 统计成功的发布平台数量
222+ SUCCESS_COUNT=0
223+ TOTAL_COUNT=3
224+
225+ [ "${{ needs.publish-vscode.result }}" == "success" ] && SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
226+ [ "${{ needs.publish-openvsx.result }}" == "success" ] && SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
227+ [ "${{ needs.upload-github-release.result }}" == "success" ] && SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
228+
229+ echo "📊 发布成功率: ${SUCCESS_COUNT}/${TOTAL_COUNT} 平台"
230+
231+ if [ $SUCCESS_COUNT -eq $TOTAL_COUNT ]; then
232+ echo "🎉 所有平台发布成功!"
233+ elif [ $SUCCESS_COUNT -gt 0 ]; then
234+ echo "⚠️ 部分平台发布成功,请检查失败的平台"
235+ else
236+ echo "❌ 所有平台发布失败"
237+ exit 1
238+ fi
0 commit comments