如何基于另一Workflow的触发与运行状态配置GitHub Action条件执行
问题分析
当前配置存在两个核心问题:
- 当A和B同时被push触发时,B会被
push和workflow_run同时触发,导致两个B实例并行运行,不符合"先A后B"的要求; - 仅触发A时,A完成后会通过
workflow_run触发B,违反了"仅触发A时B无需执行"的规则。
调整方案
核心思路
- 让B的
push触发仅在未同时触发A的场景下生效; - 在A中新增条件触发逻辑:仅当本次触发A的事件同时满足B的触发条件时,才在A完成后触发B;
- 保留手动触发能力,确保按需运行。
修改后的配置
Workflow A(A.yml)
name: A on: push: branches: [main] paths: - "java/src/test/**/*" workflow_dispatch: jobs: # 保留你原有的A执行任务 a-main-job: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 # 这里添加A的其他执行步骤 # 新增:仅当本次push同时涉及B的触发路径时,在A完成后触发B trigger-b-on-demand: runs-on: ubuntu-latest needs: a-main-job # 等待A的主任务执行完成 if: > github.event_name == 'push' && contains(github.event.head_commit.modified, 'java/src/main/') steps: - uses: actions/github-script@v6 with: script: | github.rest.actions.createWorkflowDispatch({ owner: context.repo.owner, repo: context.repo.repo, workflow_id: 'B.yml', // 替换为你的Workflow B实际文件名 ref: context.ref })
Workflow B(B.yml)
name: B on: push: branches: [main] paths: - "java/src/main/**/*" paths-ignore: - "java/src/test/**/*" # 排除同时触发A的场景 workflow_dispatch: # 保留手动触发入口 jobs: b-main-job: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 # 这里添加B的其他执行步骤
逻辑验证
- A和B同时触发:push同时修改
java/src/test/和java/src/main/下的文件时,A被正常触发;B的push触发因paths-ignore被拦截,等待A完成后,由A的trigger-b-on-demand任务触发B,实现先A后B; - 仅触发A:push仅修改
java/src/test/文件时,A正常执行,trigger-b-on-demand的条件不满足,不会触发B; - 仅触发B:push仅修改
java/src/main/文件时,B的push触发条件满足,直接运行;手动触发workflow_dispatch也可正常执行。
内容的提问来源于stack exchange,提问作者alfex4936
相关产品推荐
相关产品推荐

