如何在gitlab ci中指定更改?

如何在gitlab ci中指定更改?,gitlab,gitlab-ci,Gitlab,Gitlab Ci,gitlab引入和更改,允许在发生更改时指定要运行的作业。 我想知道如何将作业配置为跳过或忽略路径 例如,我希望为任何更改运行ci,除非它是docs路径中的更改。 如果src和docs中都发生了更改,则应执行作业, 但是,如果更改仅在docs文件夹中,则不应执行作业。更新2 GitLab将globs用于其规则:更改。在标准globs中没有直接排除文件夹的方法,但我们可以解决这个问题,包括文件夹文档中除文件以外的所有内容: myjob: script: build myproject ru

gitlab
引入和更改,允许在发生更改时指定要运行的作业。
我想知道如何将作业配置为跳过或忽略路径

例如,我希望为任何更改运行ci,除非它是
docs
路径中的更改。
如果
src
docs
中都发生了更改,则应执行作业,
但是,如果更改仅在
docs
文件夹中,则不应执行作业。

更新2 GitLab将globs用于其
规则:更改
。在标准globs中没有直接排除文件夹的方法,但我们可以解决这个问题,包括文件夹
文档
中除文件以外的所有内容:

myjob:
  script: build myproject
  rules:
   - changes:
     - "*"
     - "?/**/*"
     - "??/**/*"
     - "???/**/*"
     - "[^d]???/**/*"
     - "?[^o]??/**/*"
     - "??[^c]?/**/*"
     - "???[^s]/**/*"
     - "?????*/**/*"
     when: on_success
第一个
*
匹配所有文件。第二到第四个全局行匹配文件夹中具有1-3个字符的所有内容。第五行匹配文件夹中四个字符长的所有内容,除非它以
d
开头。除第二个字符是a
o
外,该行后面的行匹配所有四个字符长的文件夹。接下来的两行对
c
s
执行相同的操作,这四行一起匹配所有具有四个字符的文件夹,除了
文档

最后一行匹配文件夹中五个或更多字符长的所有内容

更新 当我正确理解这个问题时:

myjob:
  script: build myproject
  rules:
   - changes:
     - docs/**/*
     when: never
   - when: on_success
如果
文档
发生更改,则跳过此作业;否则,此作业的行为与正常作业相同,如果前一阶段的所有作业都成功,则会运行此作业

旧答案 像这样的方法应该会奏效:

myjob:
  script: build myproject
  rules:
   - changes:
     - src/**/*
     when: on_success
   - changes:
     - docs/**/*
     when: never
规则从上到下进行评估。如果对
src
目录中的任何文件进行了更改,作业将在以下时间获得属性
:on\u success
。这是GitLab作业的默认值,意味着如果前一阶段的所有作业都已执行,则将执行此作业

如果第一条规则不匹配,将评估第二个作业。如果对
docs
文件夹有任何更改,作业将在以下情况下获得属性
:never
,并且作业将永远不会执行

第二条规则可以更改为:

- when: never

但我想你真正的任务比你的问题要复杂一点,你可能需要这个完整的规则。

其实并不复杂。。但是这个解决方案还不够好,因为除了
文档
之外,我想对任何更改执行作业。我不知道每个服务是如何构建的,并且不是所有的代码都在
src
文件夹下。如果
测试
测试
dockerfile
等发生更改,则可能有人希望执行作业更新后的答案相当不错,但如果
文档
发生更改,并且源代码也发生更改,则可能会出现问题,在这种情况下,我想执行这项工作,我不确定是否有可能实现你想要的。GitLab CI中的
规则
仅/除
都使用glob模式来匹配文件。标准的glob模式没有排除路径的方法,但在某些地方它可以编写
!(docs/***)
表示“所有与
docs/***
不匹配的内容。GitLab对更改使用了类似的glob,但它似乎与任何内容都不匹配。我添加了一种编写
规则的方法:更改
,这样,如果只更改
文档
,则跳过作业,但如果还更改了任何内容,则执行作业。