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

