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
相关产品推荐
相关产品推荐

