Gitlab CI/CD 工作流程规则变量仅允许一个 if 条件

ph1*_*psG 2 gitlab gitlab-ci

我目前正在尝试构建我的 .gitlab-ci.yml 文件,如下所示:

  • 有一个名为“a”的管道,它只能从开发分支运行
  • 有一个名为“b”的管道,它只能从开发分支运行,但只能在从网络触发时运行

为了避免将这些规则直接放入作业中(实际上大约有 30 个作业),我想在全球范围内重用这些规则。除了使用工作流程:规则之外,我找不到更好的方法。

workflow:
  rules:
    - if $CI_COMMIT_BRANCH == "develop"
      variables:
        RUN_A: "true"
    - if $CI_COMMIT_BRANCH == "develop" && $CI_PIPELINE_SOURCE == "web"
      variables:
        RUN_B: "true"

job-a:
  rules:
    - if: $RUN_A == "true"
  script:
    - exit 0

job-b:
  rules:
    - if: $RUN_B == "true"
  script:
    - exit 0
Run Code Online (Sandbox Code Playgroud)

问题是,如果开发中有一个 Web 触发器,它不会将“RUN_B”设置为true。它只会有“RUN_A”和true. 我添加了另一项工作来打印变量只是为了确保:

test:
  image: alpine
  script:
    - echo $RUN_A
    - echo $RUN_B
Run Code Online (Sandbox Code Playgroud)

这只会打印trueRUN_A,但不会打印 RUN_B。我在 Gitlabs 文档中找不到任何说明它只会使用第一个匹配规则的内容。无论如何,有更好的方法来处理这个问题吗?我缺少什么?

小智 5

因为 GitLab ciRules是按顺序评估的,直到第一个匹配。

在您的第一个规则if $CI_COMMIT_BRANCH == "develop"匹配时,创建管道,此时RUN_A: "true"设置了变量,但变量RUN_B未定义。

根据您的情况,您可以修改 .gitlab-ci.yml。变量设置和规则顺序。

workflow:
  rules:
    - if: $CI_COMMIT_BRANCH == "develop" && $CI_PIPELINE_SOURCE == "web"
      variables:
        RUN_B: "true"
        RUN_A: "true"
    - if: $CI_COMMIT_BRANCH == "develop"
      variables:
        RUN_A: "true"

default:
  image: alpine

job-a:
  rules:
    - if: $RUN_A == "true"
  script:
    - exit 0

job-b:
  rules:
    - if: $RUN_B == "true"
  script:
    - exit 0

test:
  script:
    - echo $RUN_A
    - echo $RUN_B
Run Code Online (Sandbox Code Playgroud)