如何用semantic-release配合GitHub Action多平台发布Electron应用?
Electron + semantic-release 多平台发布解决方案
针对你遇到的先跑semantic-release无法更新Release、后跑又拿不到版本号的问题,推荐采用先分析版本→多平台构建→统一发布的三段式流程,完美适配GitHub Action的matrix构建。
核心思路
- 先单独执行semantic-release的分析逻辑,确定是否需要发布以及新版本号
- 仅当需要发布时,触发多平台matrix构建,用提前拿到的版本号构建产物
- 收集所有平台的构建产物后,再执行semantic-release正式发布,将产物附加到GitHub Release
GitHub Action 完整配置
name: Electron Multi-Platform Release on: push: branches: [main] jobs: # 第一步:确定是否发布及新版本号 determine-release: runs-on: ubuntu-latest outputs: version: ${{ steps.release-info.outputs.version }} should-release: ${{ steps.release-info.outputs.should-release }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # 必须拉取全量提交历史用于semantic-release分析 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' - run: npm ci - name: Extract release information id: release-info run: | # 通过dry-run模式运行semantic-release,仅分析不发布 RELEASE_OUTPUT=$(npx semantic-release --dry-run --no-ci 2>&1) # 判断是否需要发布 if echo "$RELEASE_OUTPUT" | grep -q "The next release version is"; then SHOULD_RELEASE="true" VERSION=$(echo "$RELEASE_OUTPUT" | grep "The next release version is" | awk '{print $NF}') else SHOULD_RELEASE="false" VERSION="" fi # 输出变量供后续job使用 echo "version=$VERSION" >> "$GITHUB_OUTPUT" echo "should-release=$SHOULD_RELEASE" >> "$GITHUB_OUTPUT" # 第二步:多平台构建(仅需发布时执行) build: needs: determine-release if: needs.determine-release.outputs.should-release == 'true' runs-on: ${{ matrix.os }} strategy: matrix: os: [windows-latest, ubuntu-latest, macos-latest] steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' - run: npm ci - name: Set app version run: npm version ${{ needs.determine-release.outputs.version }} --no-git-tag-version - name: Build Electron app run: npm run build # 替换成你项目的构建命令 - name: Upload build artifacts uses: actions/upload-artifact@v4 with: name: electron-build-${{ matrix.os }} path: | dist/ # 替换成你项目的构建产物目录,比如out/、release/等 !dist/*.map # 可选:排除不需要上传的文件 # 第三步:统一发布Release及产物 publish-release: needs: [determine-release, build] if: needs.determine-release.outputs.should-release == 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' - run: npm ci - name: Download all platform artifacts uses: actions/download-artifact@v4 with: path: build-artifacts - name: Prepare release assets run: | # 创建统一目录存放所有平台产物 mkdir -p release-assets # 复制各平台产物到统一目录 cp -r build-artifacts/electron-build-windows-latest/* release-assets/ cp -r build-artifacts/electron-build-ubuntu-latest/* release-assets/ cp -r build-artifacts/electron-build-macos-latest/* release-assets/ - name: Publish with semantic-release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # 若需发布到npm,添加NPM_TOKEN: ${{ secrets.NPM_TOKEN }} run: npx semantic-release
semantic-release 配置调整
确保你的.releaserc.json或package.json中的semantic-release配置包含@semantic-release/github插件,并指定要上传的资产路径:
{ "branches": ["main"], "plugins": [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", [ "@semantic-release/github", { "assets": [ { "path": "release-assets/**/*", "label": "Platform-specific Builds" } ] } ], // 按需添加其他插件,比如@semantic-release/npm、@semantic-release/git等 ] }
关键细节说明
determine-releasejob通过--dry-run模式避免提前创建Release,同时获取版本号和发布状态buildjob依赖第一步的输出,仅在需要发布时执行,确保资源不浪费- 构建时用
npm version更新package.json版本,保证产物带正确版本信息 - 最后统一收集产物后发布,确保所有平台资产都能附加到同一个GitHub Release
内容的提问来源于stack exchange,提问作者baruchiro
相关产品推荐
相关产品推荐

