如何配置GitHub Actions实现基础设施优先部署的工作流触发逻辑?
问题
我有两个GitHub Actions工作流文件:
- 一个监听
infrastructure文件夹的变更(部署AWS CDK通用资源) - 另一个监听单仓库(monorepo)其余部分的所有变更(部署应用)
应用部署依赖基础设施资源已就绪,因此需要实现以下运行逻辑:
- 若提交包含
infrastructure变更,先执行基础设施部署工作流,完成后再执行应用部署工作流 - 若提交不包含
infrastructure变更,直接执行应用部署工作流
我了解needs用于同一工作流内的任务依赖,workflow_run需要指定completed/in_progress/requested状态,想知道能否实现上述需求,还是必须将基础设施任务整合到应用部署工作流中?
现有工作流代码
infrastructure工作流
name: infrastructure on: push: branches: - main paths: - 'infrastructure/**' - '**.md' jobs: infrastructure: runs-on: ubuntu-latest steps:
deploy工作流
name: deploy on: push: branches: - main paths-ignore: - 'infrastructure/**' - '**.md' workflow_dispatch: inputs: environment: description: 'Environment to deploy' type: environment required: true default: 'dev'
解决方案
不需要将两个工作流整合,通过调整deploy工作流的触发配置即可实现需求,具体操作如下:
1. 修改deploy工作流的触发条件
在deploy工作流的on字段中添加workflow_run规则,监听infrastructure工作流的成功完成事件,确保基础设施部署完成后再触发应用部署:
name: deploy on: push: branches: - main paths-ignore: - 'infrastructure/**' - '**.md' workflow_dispatch: inputs: environment: description: 'Environment to deploy' type: environment required: true default: 'dev' # 新增:当infrastructure工作流成功完成时触发deploy workflow_run: workflows: ["infrastructure"] types: - completed branches: - main
2. 添加工作流状态校验
在deploy的jobs中添加条件判断,确保只有infrastructure工作流执行成功时,才继续应用部署(避免工作流失败后误触发):
jobs: deploy: runs-on: ubuntu-latest # 触发条件:push/手动触发,或infrastructure工作流成功完成 if: | (github.event_name == 'push') || (github.event_name == 'workflow_dispatch') || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') steps: # 这里写你的应用部署步骤
逻辑说明
- 含infrastructure变更的提交:原
infrastructure工作流会被触发,待其成功完成后,workflow_run规则会自动触发deploy工作流,满足依赖顺序 - 不含infrastructure变更的提交:原
paths-ignore规则会直接触发deploy工作流,无需等待 - 异常场景:如果
infrastructure工作流执行失败,deploy工作流不会被触发,避免依赖资源未就绪导致的部署失败 - 手动部署:通过
workflow_dispatch触发时,依然可以直接执行deploy工作流,不影响紧急部署操作
内容的提问来源于stack exchange,提问作者ashley
相关产品推荐
相关产品推荐

