使用Gitlab规则排除某个作业

问题描述 投票:0回答:1

如果存在具有特定源和目标分支的合并请求(MR)(或具有特定标题的合并请求),我想从 Gitlab 管道中排除一些作业。我有3个分支:开发、测试和生产。逻辑如下:

  • 如果有一个从生产分支到测试分支的 MR(MR 标题=“生产到测试”),我的作业不应该运行;
  • 如果有一个从测试分支到开发分支的 MR(MR 标题=“测试到开发”),我的也不应该运行;
  • 如果还有上面未列出的其他 MR(MR 名称无关紧要,但不能是上面两个之一),我的作业应该运行。

我尝试了不同的规则组合,但似乎都不起作用。以下是我如何尝试实现此目的的一些示例:

rules:
   - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "production" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "testing"
     when: never
   - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "testing" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "development"
     when: never
   - if: $CI_PIPELINE_SOURCE == "merge_request_event"

在这里,我尝试结合前面示例中的前两条规则,并排除特定的 MR 头衔:

rules:
   - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "production" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "testing" || $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "testing" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "development"
     when: never
   - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TITLE != "production into testing"
   - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TITLE != "testing into development"

这是我想展示的最后一个例子:

rules:
   - if: $CI_MERGE_REQUEST_TITLE == "production into testing" || $CI_MERGE_REQUEST_TITLE == "testing into development"
     when: never
   - if: $CI_COMMIT_BRANCH == "production" || $CI_COMMIT_BRANCH == "testing" || $CI_COMMIT_BRANCH == "development"

这些例子都不起作用。 Gitlab 文档 指出规则会逐条验证,直到第一个匹配为止。当匹配时,规则就会被执行。不应考虑进一步的规则。我通常的工作流程是,有一些功能分支合并到所有三个分支中:开发、测试和生产。此时,每个管道的每个作业都在运行,因为源和目标分支或 MR 标题与上述从不运行类型规则之一不匹配。当合并到生产中时,有一个工作,自动使用 API 创建两个新的合并请求(仅创建) - 从“生产到测试”和“从测试到开发”。这就是问题开始的地方。当我进行合并时,具有所有这些从不运行类型规则的作业仍然在测试或开发管道中执行,尽管规则中的 MR 标题或源和目标分支阻止了该特定作业的执行。我在这里缺少什么?

gitlab gitlab-ci pipeline
1个回答
0
投票

您好,欢迎来到 SO。

你可以在这里尝试一下吗?那么将

CI_PIPELINE_SOURCE
与源分支名称和目标分支名称规则组合在一起作为单个语句?

我会避免“MR 标题解析”并且不会在标题中使用它。

  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"
          && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "production"
          && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "testing"'
      when: never
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"
          && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "testing"
          && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "development"'
      when: never
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      when: on_sucess

您还可以在“始终”运行的作业中回显变量。这样您就可以获得一些调试信息并可以检查您的规则。

debug:
  script:
    - echo ${CI_PIPELINE_SOURCE}
    - echo ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}
    - echo ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
  rules:
    - when: always
© www.soinside.com 2019 - 2024. All rights reserved.