GitLab CI疑问:下游流水线失败时仍允许合并Merge Request
GitLab下游流水线失败仍允许合并MR的问题解决
环境
GitLab Enterprise Edition 16.0.0-pre
配置情况
项目已配置为合并请求必须通过流水线检查(路径:Settings > Merge requests)
.gitlab-ci.yml 内容
merge_request_pipeline: rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"' when: always trigger: include: .gitlab/.merge-request-pipeline.yaml
.gitlab/.merge-request-pipeline.yaml 内容
tf_init_dev: environment: 'DEV' image: name: "hashicorp/terraform:1.4.6" entrypoint: [""] script: - terraform init tags: - gitlab-org-docker
问题描述
创建Merge Request时,主流水线和下游流水线均按预期触发,但当下游流水线失败时,仍允许合并该Merge Request。
疑问与解答
1. 这是预期行为吗?
不是预期行为。原因是当前主流水线仅负责触发下游流水线,触发动作完成后主流水线就会标记为成功;而GitLab的流水线检查默认只校验主流水线的状态,不会自动关联下游流水线的执行结果,所以下游失败不会影响主流水线状态,也就无法阻止MR合并。
2. 如何配置使下游流水线失败时禁止合并MR?
有两种可靠的配置方式:
方式一:让主流水线依赖下游流水线状态
修改.gitlab-ci.yml中的trigger配置,添加strategy: depend选项,使主流水线等待下游流水线完成,并继承其状态。如果下游失败,主流水线也会标记为失败,触发流水线检查拦截合并。
修改后的.gitlab-ci.yml:
merge_request_pipeline: rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"' when: always trigger: include: .gitlab/.merge-request-pipeline.yaml strategy: depend # 新增此配置
方式二:直接将下游作业纳入主流水线
将下游流水线的配置直接通过include引入主流水线,而非使用trigger触发独立的下游流水线。这样所有作业都属于主流水线,只要有作业失败,主流水线就会失败,从而阻止MR合并。
修改后的.gitlab-ci.yml:
include: - local: .gitlab/.merge-request-pipeline.yaml merge_request_pipeline: rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"' when: always
内容的提问来源于stack exchange,提问作者GreenyMcDuff
相关产品推荐
相关产品推荐

