GitHub 操作 | 触发根文件夹流水线,不包括一个子文件夹

4

我希望当目录 /ProjectA/ 及其子目录中的任何文件改变时触发管道,但排除 /ProjectA/sub-dir-a 目录。

为了实现这个结果,我添加了以下事件,但是它会抛出一个错误,说路径和忽略路径不能在同一个事件中添加。

    on:
  push:
    branches: [ master ]
    paths: "ProjectA/**"
    paths-ignore: " ProjectA/sub-dir-a /**"

收到的错误 输入图像描述

如果我将事件更改为仅包括“路径”,则即使在子文件夹中更改了任何文件,它也会触发流水线。

我正在寻找一种排除子目录的选项。

2个回答

8
如您所见,无法混合使用pathspaths-ignore,但是如果您查看过滤模式速查表,然后再查看匹配文件路径的模式部分,您会发现也可以对模式进行否定:

在模式前面使用感叹号(!)来否定它。当文件匹配一个模式并且还匹配在文件中定义的后置负模式时,该文件将不会被包含。

有了这个想法,您可以尝试使用以下内容:

on:
  push:
    branches:
      - master
    paths: 
      - "ProjectA/**"
      - "!ProjectA/sub-dir-a/**"

编辑

文档中的示例 恰好涵盖了您的情况。


“-“!Project/subdir/sub-dir-a/**”将匹配例如“ProjectX\file.txt”,因此如果我没有弄错的话,这并不能解决OP的问题。” - riQQ
嗨@riqq,它不会匹配ProjectX/**,因为该目录未包含在“路径”中。第一个模式(ProjectA/**)不包括它。 “路径”中的两个模式意味着:仅包括来自ProjectA目录的文件,但不包括ProjectA/sub-dir-a目录中的所有文件。 - Marcin Kłopotek
1
啊,你说得对。抱歉。这里的示例应该正好涵盖了 OP 的情况:https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#example-using-positive-and-negative-patterns-1 - riQQ

0
这是我在构建Docker CI/CD流水线时为Github Action做的方式。我想避免针对README文件(而不是OP中要求的子文件夹)进行docker构建,所以我做了以下操作。
on:
  push:
    branches:
      - main
    paths:
      - "java/**"
      - "!**/README.md"
  pull_request:
    branches:
        - main

这个像魔法一样奏效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接