GitHub Actions跳过docs及.md/.rst文件工作流配置不生效
问题根因
你当前配置不生效主要有4个核心问题:
- 逻辑写反:现有脚本是检测到文档变更才执行后续步骤,和你「纯文档变更跳过测试、非文档变更才执行测试」的需求完全相反
- 匹配规则不全:正则只匹配了docs目录和
.rst后缀,漏了要求跳过的.md后缀文件;且正则里的.没有转义,会误匹配任意字符 - diff逻辑缺陷:
fetch-depth: 2仅能对比最近1次提交,一次push包含多个提交时会漏判;分支首次提交时HEAD^不存在,会直接导致步骤报错 - 语法过时:
::set-output已经被GitHub官方弃用,新版本runner下会出现兼容性问题
推荐方案:使用GitHub原生路径过滤(最稳定)
不需要自己写脚本做diff判断,直接在workflow触发条件里加paths-ignore即可,GitHub会自动判断变更文件:如果所有变更文件都命中忽略列表,整个workflow不会触发,完全匹配你的需求。
修正后的完整配置如下:
name: CI Test on: push: branches: [ main ] pull_request: branches: [ main ] # 保留手动触发能力 workflow_dispatch: # 路径忽略规则:所有命中的文件变更不会触发workflow paths-ignore: - 'docs/**' # docs目录下所有文件 - '**/*.md' # 任意目录下的.md后缀文件 - '**/*.rst' # 任意目录下的.rst后缀文件 jobs: test: name: Run Testcases runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 # 这里直接放你的测试执行步骤即可,纯文档变更时job根本不会运行 - name: Run test run: echo "run your test commands here"
备选方案:Job内判断(适合同workflow存在其他任务的场景)
如果你需要在同一个workflow里保留文档相关的构建/发布任务,不能直接跳过整个workflow,可以用修正后的diff判断逻辑,注意:
- 要处理首次提交无
HEAD^的场景 - 用官方推荐的
$GITHUB_OUTPUT替代弃用的set-output - 修正正则匹配规则
- 反转判断逻辑:检测到存在非文档文件变更时才执行测试
关键步骤代码如下:
jobs: documentation_testcase: name: Test Job runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 with: fetch-depth: 0 # 拉取全部分支提交记录,避免多提交diff漏判 - name: Check non-doc file changed id: check_change shell: pwsh run: | # 处理首次提交的场景 try { $diff = git diff --name-only HEAD^ HEAD } catch { $diff = git diff --name-only HEAD --empty-tree } # 匹配所有非文档类文件:不在docs目录下,后缀不是.md/.rst $nonDocDiff = $diff | Where-Object { $_ -notmatch '^docs/' -and $_ -notmatch '\.md$' -and $_ -notmatch '\.rst$' } $hasNonDocChange = $nonDocDiff.Length -gt 0 # 用新的官方输出写法 "has_non_doc_change=$hasNonDocChange" | Out-File -FilePath $env:GITHUB_OUTPUT -Append - name: Run testcases if: steps.check_change.outputs.has_non_doc_change == 'True' run: echo "run your test commands here"
内容的提问来源于stack exchange,提问作者Sushivam
相关产品推荐
相关产品推荐

