Gitlab-CI 规则 If/Changes 没有按预期工作

Gitlab-CI rules If/Changes do not work as expected

我们正在使用 Gitlab-CI 并且刚刚发生了一个奇怪的行为。我们试图仅 运行 一个给定的工作(例如,下面的 lint )并且仅当我们在合并请求中而不是简单的 git 分支时,以及仅当 *.py 文件显示更改。然而,从我们在文档中看到的情况来看,我们似乎还可以,但实际上并非如此,因为它目前无法正常工作。例如,如果我要在 Readme.MD 上推送更改,此处管道的作业 Lint 将在不应该执行的地方执行。

拜托,如果您有任何ideas/tips,我们将不胜感激。

非常感谢您的理解, Bw.

---> Gitlab CI Yaml 配置:

.gitlab-ci.yml:

image: python:3.7

stages:
  - pre-build
  - test

.ci_rules:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_IID'
      changes:
        - tests/*.py
        - tests/*/*.py
        - src/*.py
        - src/*/*.py
    - if: $CI_COMMIT_REF_NAME == "develop"
    - if: $CI_COMMIT_REF_NAME == "main"

lint:
  stage: pre-build
  script:
    - pip install flake8
    - flake8
  rules:
    - !reference [ .ci_rules, rules ]

# [... other jobs not relevant for the issue]

问题出在你的工作规则上。以下是更好定位的编号规则:

1. $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_IID && changes
2. $CI_COMMIT_REF_NAME == "develop"
3. $CI_COMMIT_REF_NAME == "main"

让我们根据您的规则考虑一些示例、变量值和工作评估结果。请记住,如果您不在规则定义中使用 when 关键字,则作业评估只需要规则集中的一条规则即可触发作业。

  • 创建 MR develop -> main with file change
1. rule ✅
2. rule ✅
3. rule ❌
---
job evaluation = ✅ 
  • 创建 MR develop -> main 而不更改文件
1. rule ❌
2. rule ✅
3. rule ❌
---
job evaluation = ✅ 
  • 创建 MR test1 -> main 而不更改文件
1. rule ❌
2. rule ❌
3. rule ❌
---
job evaluation = ❌
  • 推送到开发分支
1. rule ❌
2. rule ✅
3. rule ❌
---
job evaluation = ✅ 
  • 推送到主分支
1. rule ❌
2. rule ❌
3. rule ✅
---
job evaluation = ✅ 

你看到了吗?我认为你的问题是你有规则 2. 和 3. 与规则 1 混合。因此,如果你在没有文件更改的情况下创建 MR,但你的源分支是 develop,作业规则被评估为真(第二个例子) .我建议将规则 1. 放在单独的工作(或模板)中。或者使用带有 when 关键字的规则并手动控制它。