当前位置:首页 > 文章列表 > 文章 > 软件教程 > GitHub Actions 怎样按路径跳过不相关工作流

GitHub Actions 怎样按路径跳过不相关工作流

来源:17golang原创 2026-11-11 21:19:08 0浏览 收藏

如果一个仓库的文档、示例或生成目录经常变化,却不需要重新执行完整 CI,可以把过滤条件写在工作流的 on 节点,而不是等任务启动后再用 if 跳过。只想排除目录时使用 paths-ignore;需要同时包含和排除时使用 paths,并用 ! 写负向模式。

最稳妥的判断是:路径过滤决定工作流是否创建,任务级 if 只决定已经创建的 job 是否运行。先在 .github/workflows/*.yml 中选对 paths 或 paths-ignore,再检查分支、标签和必需检查状态。

官方地址:https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax

1. 先根据排除范围选择字段

路径过滤目前主要用于 push 和 pull_request。两种字段不要在同一个事件下同时出现:只有排除规则时用 paths-ignore;只要存在“包含某目录、但排除其中子目录”的需求,就统一改用 paths。

需求推荐字段判断方式
文档目录变化不触发 CIpaths-ignore所有变更都落在忽略模式内时不运行;只要有一个文件在忽略范围外就运行。
只关注 src,同时排除 src/generatedpaths + !先命中正向模式,再按顺序应用负向模式。
分支与路径都要满足branches + paths两个过滤器是 AND 关系,不是二选一。

例如,仓库只想在非文档文件变化时运行构建,可以先采用下面的最小配置:

name: CI

on:
  push:
    paths-ignore:
      # 文档改动不需要启动构建任务
      - 'docs/**'
      - '**/*.md'
  pull_request:
    paths-ignore:
      # PR 只有在包含非文档文件时才进入 CI
      - 'docs/**'
      - '**/*.md'

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 运行测试
        run: go test ./... # 示例命令:替换为项目实际测试命令

2. 在 workflow 的 on 节点配置路径过滤

操作入口可以固定为:仓库首页 → Actions → 左侧选择目标 workflow → 右上角打开 workflow 文件或进入代码编辑 → 找到 on → 展开 push 或 pull_request → 在触发器下填写 paths 或 paths-ignore。GitHub 工作流文件必须放在仓库的 .github/workflows 目录。

界面中只要能确认当前编辑的是目标 YAML、事件节点没有缩进错位、过滤字段位于事件下面,就可以保存。下面的图是帮助定位字段的原创说明图,不是 GitHub 实际截图。

原创 GitHub Actions 工作流编辑界面说明图,突出 on、push、pull_request 和 paths-ignore 字段
图1:GitHub Actions 工作流触发器编辑区的原创操作示意图,不是实际页面截图。

如果只关心一个目录,例如前端代码,可以把 paths-ignore 换成 paths:

on:
  push:
    paths:
      # 命中任一模式就允许工作流创建
      - 'web/**'
      - 'package.json'
      - 'package-lock.json'

jobs:
  web-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 安装并检查前端
        run: npm ci && npm test # 安装锁定依赖后执行测试

paths 是“至少命中一个模式才运行”;它不是要求所有列出的文件都同时发生变化。模式中的 * 和 ** 用来匹配路径,写目录时通常使用 目录/** 让子目录也被覆盖。

3. 用 paths 表达“包含目录但排除子目录”

当构建只应该响应 service/,但 service/docs/ 里的文档不应触发时,不能在同一个事件里同时写 paths 和 paths-ignore。应把两类条件合并到一个 paths 列表:

on:
  pull_request:
    paths:
      # 先覆盖服务目录的全部文件
      - 'service/**'
      # 再排除服务目录中的文档子树
      - '!service/docs/**'

jobs:
  service-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 执行服务测试
        run: go test ./service/... # 只在路径过滤通过后进入这里

负向模式的顺序很重要。先有一个正向模式,再写以 ! 开头的排除模式;如果后面又写了匹配的正向模式,后者可以把之前排除的路径重新纳入。只想全部排除某些路径时,继续使用 paths-ignore 更容易读。

4. 排查“路径过滤没有生效”的几个入口

4.1 检查分支与路径是否同时满足

操作入口:workflow 文件 → on → 目标事件 → 同级查看 branches 与 paths。如果同时配置了它们,分支和路径必须都匹配。例如下面的工作流只接受 main 分支上 api/ 的改动:

on:
  push:
    branches:
      - main # 先限制目标分支
    paths:
      - 'api/**' # 再限制变更路径

jobs:
  api-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 检查 API
        run: go test ./api/... # 两个过滤条件通过后才会执行

4.2 不要用标签 push 判断路径过滤

路径过滤不会评估标签 push。如果你推送的是 tag,却期待 paths 或 paths-ignore 根据文件变化决定是否创建工作流,结果会和普通分支 push 不同。需要控制标签时,应在同一个事件下单独考虑 tags 或 tags-ignore,不要把它们和文件路径规则混为一谈。

4.3 被跳过的必需检查可能停在 Pending

操作入口:仓库 → Settings → Branches → 目标分支保护规则 → 查看必需状态检查。路径过滤跳过工作流后,关联检查可能保持 Pending;如果合并规则要求它成功,PR 可能因此无法合并。此时先确认这个检查是否真的应该对所有 PR 都是必需项,再决定调整分支保护规则或把过滤粒度改细。

保存修改后,可以按这个顺序观察:仓库 → Actions → 选择 workflow → 查看最近运行列表 → 对照变更文件和事件类型。下面的原创结果示意图只用来说明状态关系,不代表某个真实仓库已经执行。

原创 GitHub Actions 运行列表说明图,展示路径条件和 skipped 状态的对应关系
图2:路径过滤结果与运行状态的原创结果示意图,不是实际运行截图。

5. 一份可直接套用的检查清单

  1. workflow 文件是否位于 .github/workflows,并且编辑的是正确文件。
  2. 同一个事件是否误写了 paths 和 paths-ignore 两个字段。
  3. 只有排除需求时,paths-ignore 是否覆盖了所有需要忽略的目录。
  4. 混合包含与排除时,paths 是否先写正向模式,再写 ! 负向模式。
  5. 是否同时存在分支条件,导致路径匹配但分支不匹配。
  6. 测试的是普通分支 push 或 PR,还是标签 push;后者不使用路径过滤判断。
  7. PR 是否把被过滤的检查设为必需检查,导致状态停留在 Pending。

常见问题

paths-ignore 是“所有文件都忽略才跳过”吗?

是。只有当一次变更中的所有路径都匹配 paths-ignore 时,工作流才不会运行;只要有一个文件不匹配忽略模式,工作流就会创建。

可以把 paths 和 paths-ignore 同时写在 push 下吗?

不可以。想同时包含和排除时,把排除模式写进 paths,用 ! 表示负向匹配。

为什么修改 docs 后 PR 还是显示检查 Pending?

路径过滤可能跳过了工作流,但分支保护仍把对应检查列为必需项。到分支保护规则中确认该检查的必需性,或者重新设计工作流触发边界。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
VS Code 调试时怎样设置条件断点减少停顿VS Code 调试时怎样设置条件断点减少停顿
上一篇
VS Code 调试时怎样设置条件断点减少停顿
GitHub Actions 缓存键怎样避免依赖串用
下一篇
GitHub Actions 缓存键怎样避免依赖串用
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    984次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    990次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    1111次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    1081次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    925次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码