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

GitHub Actions工作流依赖执行问题:如何让CI等待镜像构建完成?

问题描述

我有两个GitHub Actions工作流文件:ci.yml和docker_build.yml:

  • ci.yml:基于Docker Hub镜像执行构建与测试
  • docker_build.yml:构建镜像并推送到Docker Hub

现有触发规则

  • docker_build.yml仅在Dockerfile或自身变更时触发:
name: Build and push docker image
on:
  push:
    paths:
      - .github/workflows/docker_build.yml #maybe later i will update it 
      - Dockerfile
...
  • ci.yml原本仅在代码相关文件变更时触发,后来添加了workflow_run规则:
name: Build and Test

on:
  workflow_run:
    workflows: [ "Build and push docker image" ]
    types:
      - completed
  push:
    paths:
      - .github/workflows/ci.yml
      - src/**
      - include/**
      - test/**
      - CMakeLists.txt

期望场景

  1. 仅代码变更:仅运行Build and Test工作流
  2. 仅Dockerfile变更:仅运行Build and push docker image工作流
  3. Dockerfile与代码同时变更:先完成Build and push docker image,再运行Build and Test

当前问题

前两个场景正常,但第三个场景中Build and Test会直接启动,不会等待镜像构建工作流完成。


解决方案

问题核心是:当代码和Dockerfile同时变更时,ci.yml的push触发规则会直接启动工作流,而workflow_run会触发另一个独立的Build and Test实例,导致两个测试工作流并行。要实现依赖等待,需调整触发逻辑,让ci.yml在代码+Dockerfile变更时,只通过workflow_run触发。

步骤1:修改ci.yml的触发规则

移除原push规则的无条件触发,新增路径排除逻辑——仅当推送的变更里不包含Dockerfile和docker_build.yml时,才通过push直接触发测试:

name: Build and Test

on:
  workflow_run:
    workflows: [ "Build and push docker image" ]
    types:
      - completed
  push:
    paths:
      - .github/workflows/ci.yml
      - src/**
      - include/**
      - test/**
      - CMakeLists.txt
    # 排除Dockerfile和镜像构建工作流文件的变更
    paths-ignore:
      - .github/workflows/docker_build.yml
      - Dockerfile

步骤2:(可选)仅在镜像构建成功后触发测试

如果需要保证只有镜像构建成功时才运行测试,可在ci.yml的jobs中添加状态判断:

jobs:
  build-test:
    runs-on: ubuntu-latest
    # 仅当上游镜像构建工作流成功完成时才执行
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    steps:
      # 你的构建测试步骤...

逻辑验证

  • 仅代码变更:paths匹配且paths-ignore未命中,直接触发Build and Test
  • 仅Dockerfile变更:只有docker_build.yml触发,ci.yml的push规则因paths-ignore命中不触发,workflow_run也不会启动测试(无代码变更需求)
  • 代码+Dockerfile同时变更:ci.yml的push规则因paths-ignore命中不触发,仅当docker_build.yml完成后,才通过workflow_run触发Build and Test

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:07:13