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
期望场景
- 仅代码变更:仅运行
Build and Test工作流 - 仅Dockerfile变更:仅运行
Build and push docker image工作流 - 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
相关产品推荐
相关产品推荐

