GitLab CI中MR合并后如何获取源分支名称的技术咨询
解决合并后Pipeline获取源分支名的问题
方法1:从Git合并提交信息中提取
合并到master的默认合并提交(非快进合并)会包含源分支的描述信息,比如默认格式为Merge branch 'feature/user-profile' into master。可以通过Git命令直接提取:
# 提取最近一次合并提交里的源分支名 SOURCE_BRANCH=$(git log --merges -1 --pretty=format:"%s" | grep -oP "(?<=Merge branch ').*(?=' into)")
如果团队自定义了合并提交模板,需要调整正则表达式匹配对应格式。
方法2:在MR流水线中提前留存分支名
既然MR流水线可以正常获取CI_MERGE_REQUEST_SOURCE_BRANCH_NAME,可以在MR流水线的阶段里把源分支名写入文件并上传为流水线产物(artifact),待合并后master分支的Pipeline下载读取:
- MR流水线添加步骤:
# 写入源分支名到文件 script: - echo "$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" > source_branch.txt artifacts: paths: - source_branch.txt expire_in: 1d # 设置有效期避免冗余存储
- master分支Pipeline添加步骤:
# 读取留存的源分支名 SOURCE_BRANCH=$(cat source_branch.txt)
注意:需确保CI配置允许跨流水线下载产物,且只保留合并成功的MR流水线产物。
方法3:通过GitLab API查询合并关联的MR
如果CI环境能访问GitLab API且持有有效权限,可以通过最近一次合并提交的SHA查询对应的MR,进而获取源分支名:
# 获取master分支最近一次合并提交的SHA LATEST_MERGE_SHA=$(git log --merges -1 --pretty=format:"%H") # 调用API查询该提交关联的MR(替换项目ID和GitLab域名) SOURCE_BRANCH=$(curl --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "https://your-gitlab-domain/api/v4/projects/<项目ID>/repository/commits/$LATEST_MERGE_SHA/merge_requests" | jq -r '.[0].source_branch')
需提前在CI变量中配置GITLAB_API_TOKEN,且该token需拥有读取项目MR的权限。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

