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

