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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:20:33