You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用semantic-release配合GitHub Action多平台发布Electron应用?

Electron + semantic-release 多平台发布解决方案

针对你遇到的先跑semantic-release无法更新Release、后跑又拿不到版本号的问题,推荐采用先分析版本→多平台构建→统一发布的三段式流程,完美适配GitHub Action的matrix构建。

核心思路

  1. 先单独执行semantic-release的分析逻辑,确定是否需要发布以及新版本号
  2. 仅当需要发布时,触发多平台matrix构建,用提前拿到的版本号构建产物
  3. 收集所有平台的构建产物后,再执行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-release job通过--dry-run模式避免提前创建Release,同时获取版本号和发布状态
  • build job依赖第一步的输出,仅在需要发布时执行,确保资源不浪费
  • 构建时用npm version更新package.json版本,保证产物带正确版本信息
  • 最后统一收集产物后发布,确保所有平台资产都能附加到同一个GitHub Release

内容的提问来源于stack exchange,提问作者baruchiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:20:33