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。
现在
正如https://docs.gitlab.com/ee/ci/merge_request_pipelines/所说,
“如果您在管道成功时将此功能与合并一起使用,则合并请求的管道优先于其他常规管道。”。
我想要的是,
我怎样才能做到这一点?
另一个先决条件是我想使用“CI_MERGE_REQUEST_TARGET_BRANCH_NAME”变量,该变量仅定义为:[merge-requests] 或任何类似类型。
答案 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 的回答,我建议您使用 workflows
和 rules
来控制应该如何触发阶段。 (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"'