如何让GitLab合并MR后自动升级版本号并生成变更日志?
GitLab合并MR后自动生成版本号与变更日志的第三步实现方案
要实现第三步「GitLab生成新版本号并将缺失的MR标题添加至变更日志」,核心是绕开API对Git Trailer的依赖限制,通过流水线动态整合MR元数据、调用API生成内容并完成版本标记,具体步骤如下:
1. 预准备:配置流水线权限与变量
- 在项目的「CI/CD → 变量」中添加
GITLAB_API_TOKEN:使用具备api和write_repository权限的个人访问令牌或项目访问令牌。 - 确保流水线能拉取、推送代码到默认分支(如main/master)。
2. 自动生成新版本号
在流水线脚本中编写逻辑,基于现有标签自动递增版本号(以语义化版本的patch版本为例):
# 获取最新标签,无标签时默认初始版本v0.0.0 LATEST_TAG=$(git describe --abbrev=0 --tags 2>/dev/null || echo "v0.0.0") # 拆分版本号段 IFS='.' read -r MAJOR MINOR PATCH <<< "${LATEST_TAG#v}" # 递增patch版本 NEW_PATCH=$((PATCH + 1)) NEW_VERSION="v$MAJOR.$MINOR.$NEW_PATCH"
3. 生成含MR标题的Git Trailer提交
因为GitLab变更日志API仅识别带指定Trailer的提交,我们需要动态创建一个包含当前MR标题的提交:
# 拉取最新分支代码 git pull origin $CI_DEFAULT_BRANCH # 创建空提交,添加Changelog Trailer(内容为当前MR标题) git commit --allow-empty -m "chore: prepare release for $NEW_VERSION" -m "Changelog: $CI_MERGE_REQUEST_TITLE" # 推送到远程仓库 git push origin $CI_DEFAULT_BRANCH
注:$CI_MERGE_REQUEST_TITLE是GitLab预定义变量,仅在MR合并触发的流水线中可用,自动获取当前合并的MR标题。
4. 调用GitLab变更日志API生成内容
调用API生成对应新版本的变更日志条目:
# 调用API生成变更日志 curl --request POST \ --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" \ --header "Content-Type: application/json" \ --data '{ "version": "'"$NEW_VERSION"'", "from": "'"$LATEST_TAG"'", "to": "'"$CI_DEFAULT_BRANCH"'" }' \ "$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/changelog" # 获取生成的变更日志内容 CHANGELOG_CONTENT=$(curl --request GET \ --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" \ "$CI_API_V4_URL/projects/$CI_PROJECT_ID/repository/changelog?version=$NEW_VERSION")
5. 更新项目CHANGELOG文件并推送
将API生成的内容写入项目的CHANGELOG.md(以追加到文件开头为例):
# 将新生成的变更日志追加到文件头部 echo "$CHANGELOG_CONTENT" | cat - CHANGELOG.md > temp_changelog.md && mv temp_changelog.md CHANGELOG.md # 提交并推送更新 git add CHANGELOG.md git commit -m "docs: update changelog for $NEW_VERSION" git push origin $CI_DEFAULT_BRANCH
6. 标记新版本标签
最后为新版本创建Git标签并推送,完成版本升级:
git tag -a $NEW_VERSION -m "Release $NEW_VERSION" git push origin $NEW_VERSION
流水线触发配置
在.gitlab-ci.yml中配置仅在MR合并到默认分支时触发该任务:
release_job: stage: release only: - main # 替换为你的默认分支名 - master except: - tags script: # 依次执行上述步骤的脚本代码
内容的提问来源于stack exchange,提问作者droomoord
相关产品推荐
相关产品推荐

