如何实现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文件..."
关键说明:
fetch-depth: 2:必须设置这个参数,否则无法获取到上一个提交的历史,无法对比当前提交的修改文件。- 文件检查逻辑:通过
git diff --name-only HEAD^ HEAD获取当前提交的所有修改文件,再用grep过滤非.json文件,存在则标记终止信号。 - 终止逻辑:使用
exit 0会让工作流标记为成功但停止后续步骤,若需要明确标记为失败,可改为exit 1。
如果你的PR包含多个提交,且希望对每个提交单独检查,可结合GitHub API遍历PR的所有提交并逐个验证,但这种方式相对复杂,上述方法是最简洁的单个提交检查方案。
内容的提问来源于stack exchange,提问作者fgalan
相关产品推荐
相关产品推荐

