如何在单个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
相关产品推荐
相关产品推荐

