如何在GitLab CI中处理合并冲突并避免触发流水线?
如何在GitLab CI中避免合并冲突时触发流水线
问题场景
所有GitLab CI作业在正常场景下均可按预期执行,但当合并请求出现合并冲突时,流水线仍会触发,希望实现冲突解决完成前不触发流水线的效果。
当前使用的流水线配置示例:
image: alpine:latest workflow: rules: - if: $CI_COMMIT_BRANCH =~ /^(dev)$/ || $CI_MERGE_REQUEST_IID || $CI_PIPELINE_SOURCE =~ /^(web)/ stages: - build build software: stage: build script: - printenv - echo "Building code for $CI_COMMIT_BRANCH"
解决方案
GitLab CI提供了预定义变量用于判断合并请求的冲突状态,可通过修改workflow规则实现需求:
核心实现思路
- 利用GitLab内置的
$CI_MERGE_REQUEST_HAS_CONFLICTS变量,该变量在合并请求存在冲突时会被设为"true" - 在
workflow的规则中添加条件,当合并请求存在冲突时跳过流水线触发
修改后的配置示例
image: alpine:latest workflow: rules: # 保留原有分支和web触发的流水线规则 - if: $CI_COMMIT_BRANCH =~ /^(dev)$/ || $CI_PIPELINE_SOURCE =~ /^(web)/ # 合并请求触发的流水线,仅在无冲突时运行 - if: $CI_MERGE_REQUEST_IID when: always except: variables: - $CI_MERGE_REQUEST_HAS_CONFLICTS == "true" stages: - build build software: stage: build script: - printenv - echo "Building code for $CI_COMMIT_BRANCH"
低版本GitLab兼容方案
如果你的GitLab版本不支持$CI_MERGE_REQUEST_HAS_CONFLICTS变量,可通过调用GitLab API检查冲突状态:
image: alpine:latest workflow: rules: - if: $CI_COMMIT_BRANCH =~ /^(dev)$/ || $CI_PIPELINE_SOURCE =~ /^(web)/ - if: $CI_MERGE_REQUEST_IID # 调用API检查合并请求冲突状态 script: - apk add curl jq - CONFLICT_STATUS=$(curl --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID" | jq -r ".has_conflicts") - if [ "$CONFLICT_STATUS" = "true" ]; then exit 1; fi when: always
注:需提前在项目CI/CD变量中配置GITLAB_API_TOKEN(具备合并请求读取权限)。
内容的提问来源于stack exchange,提问作者verb
相关产品推荐
相关产品推荐

