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

如何让GitHub Actions的workflow_run触发工作流感知分支

解决GitHub Actions中workflow_run触发的CD工作流分支感知问题

问题根源

使用workflow_run触发工作流时,GitHub会默认从仓库默认分支拉取目标工作流文件(比如你的cd.yml)来执行,而非触发CI的那个分支。这就是为什么你修改非默认分支的cd.yml后,测试时依然用的是默认分支的配置。

解决方案一:用workflow_dispatch替代workflow_run触发CD

通过在CI工作流成功后,主动触发CD工作流并指定触发分支,让CD工作流使用对应分支的配置文件。

步骤1:修改ci.yml,添加触发CD的job

在CI工作流的末尾新增一个job,仅当所有CI步骤成功时运行,通过GitHub API触发CD工作流:

# ci.yml
name: Building and testing Bosap
on:
  push:
    branches:
      - 'develop'
      - 'dev-*'
      - 'feat-*'
      - 'bug-*'
      - 'fix-*'

jobs:
  # 原有的CI jobs:安装、代码检查、测试
  build-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      # ... 你的CI步骤

  # 新增触发CD的job
  trigger-cd:
    needs: build-test
    runs-on: ubuntu-latest
    if: success()
    steps:
      - name: Trigger CD workflow
        uses: actions/github-script@v6
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            await github.rest.actions.createWorkflowDispatch({
              owner: context.repo.owner,
              repo: context.repo.repo,
              workflow_id: 'cd.yml',
              ref: context.ref, // 使用当前CI的分支
              inputs: {
                // 可按需传递参数给CD工作流,比如版本号等
              }
            })

步骤2:修改cd.yml的触发条件

将cd.yml的触发改为workflow_dispatch(支持手动触发+API触发),同时保留分支过滤:

# cd.yml
name: Distribute Bosap
on:
  workflow_dispatch:
    branches:
      - 'develop'
      - 'dev-*'
      - 'feat-*'
      - 'bug-*'
      - 'fix-*'

jobs:
  distribute:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.ref }} // 检出触发分支的代码
      # ... 你的分发步骤

这样配置后,CI成功时会触发对应分支的cd.yml执行,完美解决分支感知问题。

解决方案二:合并CI与CD为单个工作流(更简单的架构)

如果不需要严格拆分CI和CD的职责,可以将两者合并到同一个工作流中,通过needs和条件判断控制CD的执行:

name: CI & CD for Bosap
on:
  push:
    branches:
      - 'develop'
      - 'dev-*'
      - 'feat-*'
      - 'bug-*'
      - 'fix-*'

jobs:
  ci:
    name: Build and Test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      # ... 你的CI步骤:安装、代码检查、测试

  cd:
    name: Distribute Bosap
    needs: ci
    if: success() // 仅当CI成功时运行
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      # ... 你的分发步骤

这种架构的优势是:

  • 工作流配置集中,维护更方便
  • 天然具备分支感知能力,直接使用当前分支的配置
  • 避免跨工作流触发的上下文丢失问题

方案选择建议

  • 如果需要权限分离(比如CI由开发团队维护,CD由运维团队维护)、或者需要单独触发CD工作流,优先选方案一。
  • 如果CI和CD职责耦合度高,不需要单独触发,方案二更简洁高效。

内容的提问来源于stack exchange,提问作者hYg-Cain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:42:53