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
关键字的规则并手动控制它。
我们正在使用 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
关键字的规则并手动控制它。