Gitlab-CI 规则如果/更改未按预期工作

Sim*_*ost 15 continuous-integration gitlab gitlab-ci devops

我们正在与 GitLab CI 合作,刚刚发生了一个奇怪的行为。我们尝试仅在文件发生更改并且处于合并请求而不是简单的 git 分支时运行给定作业(例如,lint如下所示) 。*.py例如,如果我要在 上推送更改Readme.MD,则此处管道的作业Lint将在不应该执行的地方执行。

.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]
Run Code Online (Sandbox Code Playgroud)

cze*_*nde 28

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

\n
1. $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_IID && changes\n2. $CI_COMMIT_REF_NAME == "develop"\n3. $CI_COMMIT_REF_NAME == "main"\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
    \n
  • 创建 MR 开发 -> main 并更改文件
  • \n
\n
1. rule \xe2\x9c\x85\n2. rule \xe2\x9c\x85\n3. rule \xe2\x9d\x8c\n---\njob evaluation = \xe2\x9c\x85 \n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 创建MR开发->main,不改变文件
  • \n
\n
1. rule \xe2\x9d\x8c\n2. rule \xe2\x9c\x85\n3. rule \xe2\x9d\x8c\n---\njob evaluation = \xe2\x9c\x85 \n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 创建 MR test1 -> main 而不更改文件
  • \n
\n
1. rule \xe2\x9d\x8c\n2. rule \xe2\x9d\x8c\n3. rule \xe2\x9d\x8c\n---\njob evaluation = \xe2\x9d\x8c\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 推送到develop分支
  • \n
\n
1. rule \xe2\x9d\x8c\n2. rule \xe2\x9c\x85\n3. rule \xe2\x9d\x8c\n---\njob evaluation = \xe2\x9c\x85 \n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 推送到主分支
  • \n
\n
1. rule \xe2\x9d\x8c\n2. rule \xe2\x9d\x8c\n3. rule \xe2\x9c\x85\n---\njob evaluation = \xe2\x9c\x85 \n
Run Code Online (Sandbox Code Playgroud)\n

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

\n