如何实现:Build Docker Image成功或未触发时触发目标GitHub工作流?
解决方案
要实现你的需求,核心是避免push事件同时触发两个工作流,同时保证两种场景下CI - Tests & Quality都能正确运行。这里提供两种可行方案:
方案一:通过触发器路径过滤(推荐)
直接在push触发器中排除Dockerfile相关变更,让这类场景下仅由workflow_run触发CI工作流;无Dockerfile变更时,仍由push直接触发。
修改后的CI - Tests & Quality配置:
name: CI - Tests & Quality on: push: branches: [ main, develop ] # 当提交包含Dockerfile变更时,不通过push触发本工作流 paths-ignore: - 'Dockerfile' # 如果有Docker相关的其他文件(如docker-compose.yml),也可一并添加 pull_request: branches: [ main, develop ] workflow_run: workflows: ["Build Docker Image"] types: [ completed ] workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true env: DOCKER_IMAGE: ${{ secrets.DOCKERHUB_USERNAME }}/vision jobs: verify-image: name: Verify Docker Image runs-on: ubuntu-latest # 仅在workflow_run事件且Build工作流成功时,或非workflow_run事件时运行 if: | github.event_name != 'workflow_run' || (github.event.workflow_run.conclusion == 'success') # ... 后续步骤
配合Build Docker Image的触发条件(需确保):
该工作流仅在Dockerfile变更时触发:
name: Build Docker Image on: push: branches: [ main, develop ] paths: - 'Dockerfile' # 其他触发器(如workflow_dispatch)... # ... 工作流步骤
方案二:通过Job条件判断过滤
如果不想修改触发器路径,可在Job的if条件中添加逻辑,判断push事件是否包含Dockerfile变更,若包含则跳过当前运行,等待workflow_run触发。
修改后的Job条件:
jobs: verify-image: name: Verify Docker Image runs-on: ubuntu-latest if: | # PR和手动触发直接运行 (github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch') || # workflow_run事件仅在Build成功时运行 (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') || # push事件仅在无Dockerfile变更时运行 (github.event_name == 'push' && !contains(github.event.head_commit.modified, 'Dockerfile')) # ... 后续步骤
注意事项:
- 如果Dockerfile在子目录(如
./docker/Dockerfile),需将路径改为对应完整路径。 github.event.head_commit.modified仅适用于单个提交的场景,若为批量推送(多个提交),需结合git diff命令在步骤中判断变更文件。
内容的提问来源于stack exchange,提问作者Vincent Decaux
相关产品推荐
相关产品推荐

