如何在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
开头。除第二个字符是ao
外,该行后面的行匹配所有四个字符长的文件夹。接下来的两行对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,但它似乎与任何内容都不匹配。我添加了一种编写规则的方法:更改
,这样,如果只更改文档
,则跳过作业,但如果还更改了任何内容,则执行作业。