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

如何让GitHub Actions中Workflow B的任务等待Workflow A完成?

解决GitHub Actions多工作流同步执行问题

当同时变更/forms路径和其他路径时,要保证Workflow B的集成测试在Workflow A完成后再执行,有以下几种可行方案:

方案1:在Workflow B中主动等待Workflow A完成

通过GitHub CLI查询同一次提交下Workflow A的运行状态,循环等待直到它完成(成功)后再执行集成测试。

配置示例

在Workflow B的集成测试Job中添加等待逻辑:

jobs:
  build-app:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      # 保留原有的应用构建步骤

  integration-test:
    needs: build-app
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: 安装GitHub CLI
        run: |
          type -p curl >/dev/null || (sudo apt update && sudo apt install curl -y)
          curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
          && sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
          && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
          && sudo apt update && sudo apt install gh -y
      
      - name: 等待Workflow A完成
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          # 替换成你的Workflow A的文件名
          WORKFLOW_A_NAME="workflow-a.yml"
          COMMIT_SHA=${{ github.sha }}
          
          # 循环查询运行状态
          while true; do
            RUN_STATUS=$(gh run list --workflow "$WORKFLOW_A_NAME" --commit "$COMMIT_SHA" --json status --jq '.[0].status')
            if [ "$RUN_STATUS" = "completed" ]; then
              echo "Workflow A已完成"
              break
            elif [ -z "$RUN_STATUS" ]; then
              echo "当前提交未触发Workflow A,继续等待..."
            else
              echo "Workflow A仍在运行: $RUN_STATUS,等待30秒后重试..."
            fi
            sleep 30
          done
          
          # 检查Workflow A是否成功,失败则终止测试
          RUN_CONCLUSION=$(gh run list --workflow "$WORKFLOW_A_NAME" --commit "$COMMIT_SHA" --json conclusion --jq '.[0].conclusion')
          if [ "$RUN_CONCLUSION" != "success" ]; then
            echo "Workflow A执行失败: $RUN_CONCLUSION"
            exit 1
          fi
      
      - name: 执行集成测试
        # 添加你的集成测试步骤

方案2:重构为可复用工作流,直接调用依赖逻辑

把Workflow A的核心构建逻辑抽成可被调用的独立工作流,在Workflow B中根据提交是否包含/forms路径变更,决定是否先调用该工作流,再执行集成测试。这种方式无需跨工作流等待,更可靠。

步骤1:抽离Workflow A的可复用逻辑

创建workflow-a-callable.yml文件:

# .github/workflows/workflow-a-callable.yml
name: Workflow A - 构建Docker镜像
on:
  workflow_call:

jobs:
  build-docker:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      # 保留原有的Docker镜像构建、推送步骤

步骤2:修改原Workflow A调用可复用逻辑

# .github/workflows/workflow-a.yml
name: Workflow A
on:
  push:
    paths:
      - '/forms/**'

jobs:
  call-build-docker:
    uses: ./.github/workflows/workflow-a-callable.yml

步骤3:修改Workflow B添加条件依赖

# .github/workflows/workflow-b.yml
name: Workflow B
on:
  push:
    paths-ignore:
      - '/forms/**'

jobs:
  build-app:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      # 保留原有的应用构建步骤

  # 仅当提交包含/forms路径变更时,执行Docker镜像构建
  build-docker-if-needed:
    if: contains(github.event.head_commit.modified, '/forms/')
    uses: ./.github/workflows/workflow-a-callable.yml

  integration-test:
    # 依赖应用构建和(可选的)Docker镜像构建完成
    needs: [build-app, build-docker-if-needed]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 执行集成测试
        # 添加你的集成测试步骤

方案3:利用环境依赖控制执行顺序

给Workflow A的构建Job绑定一个环境,让Workflow B的集成测试Job依赖该环境,GitHub Actions会自动等待环境的部署完成后再执行测试Job。

步骤1:给Workflow A配置环境

# .github/workflows/workflow-a.yml
name: Workflow A
on:
  push:
    paths:
      - '/forms/**'

jobs:
  build-docker:
    runs-on: ubuntu-latest
    # 指定环境名称,可自定义
    environment: docker-image-built
    steps:
      - uses: actions/checkout@v4
      # 保留原有的Docker镜像构建、推送步骤

步骤2:给Workflow B的测试Job配置环境依赖

# .github/workflows/workflow-b.yml
name: Workflow B
on:
  push:
    paths-ignore:
      - '/forms/**'

jobs:
  build-app:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      # 保留原有的应用构建步骤

  integration-test:
    needs: build-app
    runs-on: ubuntu-latest
    # 依赖Workflow A使用的环境
    environment: docker-image-built
    steps:
      - uses: actions/checkout@v4
      - name: 执行集成测试
        # 添加你的集成测试步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:45:11