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

如何在GitLab的squash提交中关联源合并请求的构建版本标签?

GitLab中关联Squash提交与Feature分支构建版本的方案

问题场景

我们在GitLab中采用Feature分支开发 + Squash合并到Main分支的模型:

  1. Feature分支(提交2)创建MR后,CI自动构建工件(版本1.0.1+21)并部署到测试环境;
  2. Feature分支后续有修改(提交3),MR获批后通过Squash合并生成独立的提交4推送到main分支;
  3. 需要给main上的提交4添加Git标签,关联Feature分支最后一次构建的版本1.0.1+21,但提交4无直接链路关联Feature分支。

可行解决方案

方案一:通过CI流水线自动传递版本号并打标签

步骤1:在Feature分支的CI中记录版本号到MR

在Feature分支的CI构建脚本中,将构建版本号写入对应MR的合并提交模板(优先推荐):

# 假设BUILD_VERSION是CI自动生成的版本号(如1.0.1+21)
curl --request PUT \
  --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" \
  "https://gitlab.example.com/api/v4/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID" \
  --data "squash_commit_message=$(echo "$CI_MERGE_REQUEST_TITLE"'\n\n关联构建版本:'"$BUILD_VERSION"')"

步骤2:在Main分支的CI中解析版本号并打标签

在Main分支的CI流水线中,检测Squash提交,提取版本号并自动打标签:

# 从当前提交的备注中提取版本号
BUILD_VERSION=$(git log -1 --format="%b" | grep "关联构建版本:" | sed 's/关联构建版本://')

# 若提取到版本号,执行打标签操作
if [ -n "$BUILD_VERSION" ]; then
  # 配置Git用户信息(CI runner需要)
  git config --global user.name "CI Runner"
  git config --global user.email "runner@example.com"
  
  # 创建带备注的标签
  git tag -a "v$BUILD_VERSION" -m "关联Feature分支构建版本:$BUILD_VERSION"
  # 推送标签到GitLab仓库
  git push origin "v$BUILD_VERSION"
fi

方案二:手动关联标签(适合小团队/非自动化场景)

  1. Feature分支最后一次构建成功后,记录版本号1.0.1+21;
  2. 定位Main分支上的Squash提交4:
    • GitLab网页:进入main分支的提交列表,找到目标提交;
    • 命令行:拉取main分支最新代码后,用git log查看提交哈希;
  3. 打标签并推送:
    git checkout main
    git pull
    # 替换<COMMIT_HASH>为提交4的哈希值
    git tag -a v1.0.1+21 <COMMIT_HASH> -m "关联Feature分支最后构建版本:1.0.1+21"
    git push origin v1.0.1+21
    
    网页操作:点击提交右侧的「添加标签」,填写标签名和备注即可。

方案三:利用GitLab MR关联元数据提取版本号

GitLab的Squash提交会在日志中包含MR关联信息(如Merge request #123),可通过API反向查询MR获取版本号:

# 从当前提交日志中提取MR编号
MR_IID=$(git log -1 --grep="Merge request #[0-9]*" --format="%s" | sed 's/.*Merge request #\([0-9]*\).*/\1/')

# 通过GitLab API查询MR描述中的版本号
BUILD_VERSION=$(curl --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" \
  "https://gitlab.example.com/api/v4/projects/$CI_PROJECT_ID/merge_requests/$MR_IID" \
  | jq -r '.description' | grep "关联构建版本:" | sed 's/关联构建版本://')

# 后续打标签操作同方案一

注:需要在CI runner中安装jq工具用于解析JSON响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:55:24