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

如何在单个GitHub Actions工作流中为多个分支创建发布版本

GitHub Actions多分支独立发布解决方案

完全可以在单个工作流中实现多分支的独立发布,不需要拆分多个工作流配置,针对你提出的三个问题解答如下:

问题1:配置文件如何区分触发分支完成对应发布

你提到的if: github.ref是最常用的实现方式,GitHub还提供了更简洁的github.ref_name内置变量,可以直接获取触发工作流的分支名称,不需要完整匹配refs/heads/前缀。
你可以通过表达式动态生成不同分支的专属配置,比如发布标签、产物前缀等,示例用法如下:

# 可以在env段提前定义分支专属的全局变量
env:
  QT_VERSION: 5.15.2
  BUILD_TYPE: Release
  # 根据分支动态生成发布标签和产物匹配规则
  RELEASE_TAG: ${{ github.ref_name == 'main' && 'continuous-main' || 'continuous-example' }}
  packageGlob: ${{ github.ref_name == 'main' && 'justAnExample-continuous-*.*' || 'justAnExample-example-*.*' }}

如果需要某个步骤/任务仅在指定分支运行,直接添加if条件即可:

# 仅在example分支运行的步骤示例
- name: Example分支专属操作
  if: github.ref_name == 'example'
  run: echo "这个步骤只会在example分支触发时运行"

问题2:是否需要在第二个分支单独创建配置文件

不需要,你当前的触发配置已经将example分支加入了触发列表,只需要将main分支下的.yml工作流文件同步到example分支一次即可:

  • 后续如果两个分支的构建逻辑一致,保持两边的配置文件相同即可
  • 如果后续两个分支的构建逻辑有差异,各自修改对应分支下的配置文件互不影响
  • 不需要设置独立工作流,通过上面提到的动态变量区分发布标签,就不会出现和main分支发布内容冲突的问题。

问题3:是否可以在现有构建矩阵新增仅针对第二个分支的配置条目

完全可以,你可以通过矩阵的include/exclude规则,或者给矩阵项添加分支标识来实现分支专属的矩阵配置,示例如下:

strategy:
  fail-fast: false
  matrix:
    config:
    # 原有三个平台的配置保留
    - {
       name: "Linux-amd64"
       , os: ubuntu-18.04
       # 其他原有配置省略
      }
    - {
        name: "Windows-x64", WIN_ARCH: "x64"
        , os: windows-latest
        # 其他原有配置省略
      }
    - {
        name: "Windows-x86"
        , os: windows-latest, WIN_ARCH: "amd64_x86"
        # 其他原有配置省略
      }
    # 新增仅在example分支运行的MacOS构建项
    - {
       name: "MacOS-arm64"
       , os: macos-latest
       , branch_only: "example"
       # 其他MacOS构建相关配置省略
      }
    # 过滤规则:main分支下排除仅属于example的矩阵项
    exclude:
      - ${{ github.ref_name == 'main' && matrix.config.branch_only == 'example' || {} }}

现有配置的核心改动建议

你当前的配置只需要修改少量内容就能满足需求,首先修正现有配置的笔误:release_assets任务的needs字段写的是main_Build,但实际构建任务名是小写的main_build,会导致依赖找不到无法运行。
修改后的release_assets任务示例:

release_assets:
  name: Release
  needs: main_build # 修正笔误
  # 仅push到main或example分支时才执行发布,PR事件只做构建校验
  if: github.event_name == 'push' && (github.ref_name == 'main' || github.ref_name == 'example')
  runs-on: ubuntu-latest
  steps:
  - name: Download Files
    uses: actions/download-artifact@v2

  - name: Move Files
    run: |
      mv artifact/* ${{github.workspace}}
  - name: Deploy Package
    uses: "marvinpinto/action-automatic-releases@latest"
    with:
     repo_token: "${{ secrets.DEPLOYTOKEN }}"
     # 动态生成发布标签
     automatic_release_tag: ${{ env.RELEASE_TAG }}
     prerelease: false
     # 动态生成发布标题
     title: "Continuous Build (${{ github.ref_name }})"
     files: ${{env.packageGlob}}

修改完成后,push到main分支会自动生成continuous-main标签的专属发布,push到example分支会生成continuous-example标签的专属发布,两边完全独立不会互相覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:42:02