如何在GitLab的squash提交中关联源合并请求的构建版本标签?
GitLab中关联Squash提交与Feature分支构建版本的方案
问题场景
我们在GitLab中采用Feature分支开发 + Squash合并到Main分支的模型:
- Feature分支(提交2)创建MR后,CI自动构建工件(版本
1.0.1+21)并部署到测试环境; - Feature分支后续有修改(提交3),MR获批后通过Squash合并生成独立的提交4推送到
main分支; - 需要给
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
方案二:手动关联标签(适合小团队/非自动化场景)
- Feature分支最后一次构建成功后,记录版本号
1.0.1+21; - 定位Main分支上的Squash提交4:
- GitLab网页:进入
main分支的提交列表,找到目标提交; - 命令行:拉取
main分支最新代码后,用git log查看提交哈希;
- GitLab网页:进入
- 打标签并推送:
网页操作:点击提交右侧的「添加标签」,填写标签名和备注即可。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
相关产品推荐
相关产品推荐

