You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab自动合并未等并行CI阶段完成,如何配置需全部成功才合并?

解决方案:GitLab 实现并行 CI 阶段全部成功后再合并 MR

要让两个并行的 CI 作业都成功后才允许合并 Merge Request,你需要从作业触发规则和流水线成功判定两个维度调整配置,以下是具体方案:

核心问题分析

你当前的配置中,build_test 作业没有指定仅在 MR 中触发,导致 MR 流水线可能只运行 pre-commit 作业;同时 GitLab 的「Pipelines must succeed」规则要求整个流水线所有作业都成功才允许合并,若部分作业未触发,流水线会提前判定为成功,进而触发自动合并。


方案一:将并行作业放入同一阶段(推荐)

把 pre-commit 和 build_test 放到同一个 stage 下,它们会默认并行运行,只有当该 stage 的所有作业都成功,流水线才会进入后续阶段,确保合并前两个检查都完成。

修改后的 .gitlab-ci.yml 配置:

---
image: MY-IMAGE

services:
  - name: docker:dind
variables:
  DOCKER_DRIVER: overlay2
  DOCKER_HOST: tcp://docker:2375

stages:
  - validate  # 合并为同一阶段,作业默认并行
  - push

pre-commit:
  stage: validate
  image: python:3.9
  variables:
    PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit
  before_script:
    - pip install pre-commit
    - pre-commit install
  cache:
    paths:
      - ${PRE_COMMIT_HOME}
  script:
    - >
      CHANGED_FILES=$(git diff --name-only $CI_MERGE_REQUEST_DIFF_BASE_SHA
      $CI_COMMIT_SHA)
    - echo "CHANGED_FILES is $CHANGED_FILES"
    - echo "CI_COMMIT_SHA is $CI_COMMIT_SHA"
    - echo "CI_MERGE_REQUEST_DIFF_BASE_SHA $CI_MERGE_REQUEST_DIFF_BASE_SHA"
    - >
      pre-commit run --show-diff-on-failure --color=always
      --files $CHANGED_FILES
  except:
    - "15.0"
  only:
    - merge_requests

build_test:
  stage: validate
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - >
      docker buildx build
      --pull
      --cache-from $CR_REPO_NAME:15.0
      --build-arg GIT_COMMIT_SHA=$CI_COMMIT_SHORT_SHA
      --tag local/myorg-myapp:dev
      .
    - docker compose -f docker-compose.test.yml run --rm sut /opt/myapp/test-myapp
    - docker tag local/myorg-myapp:dev $CR_REPO_NAME:cmt-$CI_COMMIT_SHA
    - docker push $CR_REPO_NAME:cmt-$CI_COMMIT_SHA
  only:
    - merge_requests  # 确保在 MR 流水线中触发
  except:
    - "15.0"

方案二:保留不同阶段,确保并行作业都触发

如果你需要保留两个独立的 stage,只需给 build_test 加上 MR 触发规则,并保留 needs: [] 让它和 pre-commit 并行启动,此时流水线会等待两个阶段的所有作业都成功后才标记为完成。

修改后的 build_test 作业配置:

build_test:
  stage: build_test
  needs: []  # 保持并行启动
  variables:
    GIT_SUBMODULE_STRATEGY: normal
  script:
    - >
      docker buildx build
      --pull
      --cache-from $CR_REPO_NAME:15.0
      --build-arg GIT_COMMIT_SHA=$CI_COMMIT_SHORT_SHA
      --tag local/myorg-myapp:dev
      .
    - docker compose -f docker-compose.test.yml run --rm sut /opt/myapp/test-myapp
    - docker tag local/myorg-myapp:dev $CR_REPO_NAME:cmt-$CI_COMMIT_SHA
    - docker push $CR_REPO_NAME:cmt-$CI_COMMIT_SHA
  only:
    - merge_requests  # 新增:确保在 MR 流水线中运行
  except:
    - "15.0"

最后确认合并规则

进入项目设置 → 合并规则,确保勾选**「Pipelines must succeed」**选项,该规则会强制要求整个流水线的所有作业都成功后,才允许执行自动合并。

内容的提问来源于stack exchange,提问作者Andrius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:53:19