GitHub Actions单仓PR批准后仅触发对应服务部署工作流问题
解决单仓PR批准后仅触发对应服务部署的问题
问题根源
pull_request_review事件本身不支持路径过滤,只要工作流监听了这个事件,PR被批准时所有相关工作流都会触发。之前的路径过滤仅作用于pull_request事件,无法限制pull_request_review触发的部署步骤。
解决方案:在部署步骤中添加文件变更检查
通过在部署步骤前先检查当前PR是否包含对应服务的文件变更,再结合审核通过的条件,实现仅部署变更服务的效果。
具体实现(以Service A为例)
修改Workflow Service A的配置,引入文件变更检查工具:
name: Workflow Service A on: pull_request: branches: - main paths: - "services/serviceA/**" - "***.md" pull_request_review: types: [submitted] jobs: unit-test-serviceA: # 保留原单元测试步骤 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # ... 你的单元测试步骤 deploy-serviceA: runs-on: ubuntu-latest steps: - name: 拉取代码(需完整历史) uses: actions/checkout@v4 with: fetch-depth: 0 # 必须拉取完整历史才能对比文件变更 - name: 检查Service A相关文件是否变更 id: check-serviceA-changes uses: tj-actions/changed-files@v41 with: files: | services/serviceA/** ***.md - name: 部署Service A if: github.event.review.state == 'APPROVED' && steps.check-serviceA-changes.outputs.any_changed == 'true' # 你的部署步骤 run: | echo "开始部署Service A..." # 部署命令
Service B的配置修改同理
只需将文件路径替换为services/serviceB/**即可:
# ... 其他部分不变 - name: 检查Service B相关文件是否变更 id: check-serviceB-changes uses: tj-actions/changed-files@v41 with: files: | services/serviceB/** - name: 部署Service B if: github.event.review.state == 'APPROVED' && steps.check-serviceB-changes.outputs.any_changed == 'true' # 部署步骤
原理说明
tj-actions/changed-files工具会对比PR分支与目标分支(main)的文件差异,输出是否有匹配路径的文件变更。- 部署步骤的
if条件同时满足两个要求:PR审核通过,且当前服务的文件有变更,只有同时满足才会执行部署。
内容的提问来源于stack exchange,提问作者Sudin Shakya
相关产品推荐
相关产品推荐

