用于运行所有常规管道的 Gitlab MR 管道

时间:2021-05-19 20:37:49

标签: gitlab gitlab-ci pipeline gitlab-ci-runner

stages:
  - format
  - test

formatter:
  stage: format
  only:
      - merge_requests
  script:
    - echo ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
    - ancestor=$(git merge-base origin/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME} HEAD)
    - "do some formatting for "git-diff -name-only $ancestor HEAD"

unit_test:
  stage: test
  script:
    - "do some test"

例如,我有上面的 .gitlab-ci.yml。

现在

  1. 单元测试仅针对常规提交运行
  2. 格式仅适用于 MR。

正如https://docs.gitlab.com/ee/ci/merge_request_pipelines/所说,
“如果您在管道成功时将此功能与合并一起使用,则合并请求的管道优先于其他常规管道。”。

我想要的是,

  1. 每次提交只运行“测试”。
  2. “测试”和“格式”都为 MR 运行,只有两个管道都成功才能批准合并。

我怎样才能做到这一点?
另一个先决条件是我想使用“CI_MERGE_REQUEST_TARGET_BRANCH_NAME”变量,该变量仅定义为:[merge-requests] 或任何类似类型。

2 个答案:

答案 0 :(得分:1)

您应该使用 rules 而不是仅仅因为 only/except 不再处于积极开发中。使用规则,您的管道将如下所示:

stages:
  - format
  - test

formatter:
  stage: format
  script:
    - echo ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
    - ancestor=$(git merge-base origin/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME} HEAD)
    - "do some formatting for "git-diff -name-only $ancestor HEAD"
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

unit_test:
  stage: test
  script:
    - "do some test"
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    - if: '$CI_COMMIT_BRANCH'

formatter 阶段仅在合并请求上运行,而 unit_test 阶段在所有分支上的合并请求和提交上运行。

答案 1 :(得分:0)

除了@danielnelz 的回答,我建议您使用 workflowsrules 来控制应该如何触发阶段。 (workflow documentation)

使用工作流,您可以控制管道的工作方式或触发方式。例如,考虑以下 .gitlab-ci.yml 代码片段。使用以下工作流,当分支没有打开合并请求时,将触发与分支相关的每个阶段,但不会触发与合并请求相关的阶段。每当您创建新的合并或打开关闭的合并时,都会触发合并请求管道。当您向打开的合并请求添加提交时,默认情况下将触发两个管道(常规分支和合并请求管道)。但是,您可以通过添加

来禁用重复管道
- if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
      when: never 

到您的工作流程。在这种情况下,当合并请求打开时,只会触发与合并请求相关的阶段。在以下示例中,我提供了不同类型的阶段,希望它能帮助您构建自己的工作流程。

...

image: ...

workflow:
  rules:
    - if: '$CI_COMMIT_BRANCH' # All branches
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' # Merge requests
    - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS' # Disable duplicate pipelines
      when: never
    - if: '$CI_COMMIT_TAG' # All tags

stages:
  ...
  - build
  - test
  - code-analysis
  ...

build:
  stage: build
  script:
    ...
  rules:
    - if: '$CI_COMMIT_BRANCH'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

test:
  stage: test
  script:
    ...
  rules:
    - if: '$CI_COMMIT_BRANCH'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    - if: '$CI_COMMIT_TAG'

code-analysis:
  stage: code-analysis
  script:
    ...
  rules:
    - if: '$CI_COMMIT_BRANCH == "develop"'
    - if: '$CI_COMMIT_BRANCH == "master"'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'