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

如何实现GitHub Actions按单提交的文件路径触发工作流?

实现GitHub Actions按单个提交的文件路径触发工作流

你的问题核心是GitHub Actions对PR事件的paths条件是按整个PR的所有修改文件汇总评估,而非单个提交。要实现仅在单个提交只修改.json文件时触发工作流,可通过在工作流内添加提交文件检查步骤来实现:

解决方案:在工作流中检查当前提交的文件类型

在你的model_validation作业中,先添加步骤对比当前提交的修改文件,若包含非.json文件则终止工作流,具体配置如下:

name: Check in JSON files
on:
  push:
    paths:
      - '**/*.json'
  pull_request:
    branches:
      - master
    paths:
      - '**/*.json'      
jobs:
  model_validation:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4
        with:
          fetch-depth: 2 # 拉取最近2个提交,用于对比当前提交的修改文件

      - name: 检查提交是否仅修改JSON文件
        id: check_json_only
        run: |
          # 获取当前提交的所有修改文件
          CHANGED_FILES=$(git diff --name-only HEAD^ HEAD)
          # 判断是否存在非.json后缀的文件
          if echo "$CHANGED_FILES" | grep -v "\.json$" > /dev/null; then
            echo "non_json_exists=true" >> "$GITHUB_OUTPUT"
          else
            echo "non_json_exists=false" >> "$GITHUB_OUTPUT"
          fi

      - name: 终止非JSON提交的工作流
        if: steps.check_json_only.outputs.non_json_exists == 'true'
        run: |
          echo "本次提交包含非JSON文件修改,停止执行后续步骤"
          exit 0 # 使用exit 0避免标记工作流为失败,若需标记失败可改为exit 1

      # 这里放你原来的model_validation步骤
      - name: 执行JSON验证
        run: |
          # 你的验证命令,比如jsonlint **/*.json
          echo "开始验证JSON文件..."

关键说明:

  1. fetch-depth: 2:必须设置这个参数,否则无法获取到上一个提交的历史,无法对比当前提交的修改文件。
  2. 文件检查逻辑:通过git diff --name-only HEAD^ HEAD获取当前提交的所有修改文件,再用grep过滤非.json文件,存在则标记终止信号。
  3. 终止逻辑:使用exit 0会让工作流标记为成功但停止后续步骤,若需要明确标记为失败,可改为exit 1。

如果你的PR包含多个提交,且希望对每个提交单独检查,可结合GitHub API遍历PR的所有提交并逐个验证,但这种方式相对复杂,上述方法是最简洁的单个提交检查方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:01:12