Git CI/CD如何获取合并请求流水线提交落后数并在源分支落后时终止流水线
合并请求分支落后校验流水线配置方案
1. 获取源分支相对目标分支的落后提交数
Git CI/CD 没有预置直接返回落后提交数的变量,你可以通过合并请求场景下自动注入的内置变量,配合Git命令计算得到数值:
- 用到的内置变量:
CI_MERGE_REQUEST_SOURCE_BRANCH_NAME:合并请求的源分支名称CI_MERGE_REQUEST_TARGET_BRANCH_NAME:合并请求的目标分支名称
- 计算命令:
# 拉取目标分支最新代码 git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME:$CI_MERGE_REQUEST_TARGET_BRANCH_NAME # 计算源分支落后于目标分支的提交数 BEHIND_COMMIT_COUNT=$(git rev-list --count $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME..$CI_MERGE_REQUEST_TARGET_BRANCH_NAME)
得到的BEHIND_COMMIT_COUNT就是你需要的落后提交数值,你可以根据需求在流水线中直接调用这个变量。
2. 源分支落后时自动失败流水线
你可以在.gitlab-ci.yml中添加一个前置校验作业,实现自动校验逻辑,参考配置如下:
check_branch_sync: stage: .pre # 配置为最前置阶段,校验失败直接终止后续所有作业 rules: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # 仅合并请求流水线触发该校验 variables: GIT_DEPTH: 0 # 关闭浅克隆,避免提交数过多时计算错误 script: - git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME:$CI_MERGE_REQUEST_TARGET_BRANCH_NAME - BEHIND_COMMIT_COUNT=$(git rev-list --count $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME..$CI_MERGE_REQUEST_TARGET_BRANCH_NAME) - | if [ $BEHIND_COMMIT_COUNT -gt 0 ]; then echo "校验失败:源分支落后目标分支 $BEHIND_COMMIT_COUNT 个提交,请先合并目标分支更新后再重试" exit 1 fi - echo "校验通过:源分支与目标分支保持同步"
注意事项
- 如果你的仓库提交量很大,关闭浅克隆会拉取全量代码增加耗时,你可以将
GIT_DEPTH调整为足够大的数值(比如100),平衡耗时和计算准确性。 - 该作业不会影响正常分支推送、标签推送等其他场景的流水线运行。
内容的提问来源于stack exchange,提问作者Aswath shobi
相关产品推荐
相关产品推荐

