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

Gitlab CI/CD如何基于分支名自动修改pom.xml中的项目版本?

Gitlab CI/CD实现自动修改pom.xml版本

Gitlab CI/CD完全可以实现你需要的自动化版本修改功能,核心是利用Gitlab预定义变量结合脚本(bash或maven插件)完成分支判断与版本替换,以下是具体实现示例:

核心依赖的Gitlab CI变量

  • CI_COMMIT_BRANCH:当前构建的分支名称
  • CI_PIPELINE_IID:项目内唯一递增的流水线编号(满足release分支版本号递增需求)

实现方案

方式1:使用Maven Versions插件(推荐,适配多模块项目)

通过Maven官方的versions插件统一修改项目版本,比sed命令更可靠,不会出现标签匹配错误。

创建或修改项目根目录下的.gitlab-ci.yml:

stages:
  - prepare_version
  - build

# 阶段1:根据分支自动修改pom版本
prepare_version:
  stage: prepare_version
  image: maven:3.8.6-openjdk-11  # 选择适配项目的maven+JDK镜像
  script:
    - |
      # 判断分支类型并处理版本
      if [[ "$CI_COMMIT_BRANCH" =~ ^project/task- ]]; then
        # 提取task分支标识(如project/task-1 → task-1)
        TASK_NAME=$(echo "$CI_COMMIT_BRANCH" | cut -d'/' -f2-)
        # 替换dev-SNAPSHOT为分支名-SNAPSHOT
        mvn versions:set -DnewVersion="${TASK_NAME}-SNAPSHOT"
      elif [[ "$CI_COMMIT_BRANCH" =~ ^release/ ]]; then
        # 提取release基础版本(如release/0.0.1 → 0.0.1)
        BASE_VERSION=$(echo "$CI_COMMIT_BRANCH" | cut -d'/' -f2)
        # 组合新版本:基础版本+流水线编号(如0.0.1.4)
        NEW_VERSION="${BASE_VERSION}.${CI_PIPELINE_IID}"
        # 修改pom版本
        mvn versions:set -DnewVersion="${NEW_VERSION}"
      fi
  # 将修改后的pom传递给后续构建阶段
  artifacts:
    paths:
      - pom.xml
    expire_in: 1 hour

# 阶段2:执行项目构建
build_project:
  stage: build
  image: maven:3.8.6-openjdk-11
  script:
    - mvn clean package -DskipTests  # 根据项目需求调整构建命令
  needs:
    - prepare_version  # 依赖prepare_version阶段的输出

方式2:使用Sed命令(轻量,单模块项目可选)

如果是单模块项目,也可以直接用sed命令文本替换:

stages:
  - build

build_project:
  stage: build
  image: maven:3.8.6-openjdk-11
  before_script:
    - |
      if [[ "$CI_COMMIT_BRANCH" =~ ^project/task- ]]; then
        TASK_NAME=$(echo "$CI_COMMIT_BRANCH" | cut -d'/' -f2-)
        sed -i "s/<version>dev-SNAPSHOT<\/version>/<version>${TASK_NAME}-SNAPSHOT<\/version>/g" pom.xml
      elif [[ "$CI_COMMIT_BRANCH" =~ ^release/ ]]; then
        BASE_VERSION=$(echo "$CI_COMMIT_BRANCH" | cut -d'/' -f2)
        NEW_VERSION="${BASE_VERSION}.${CI_PIPELINE_IID}"
        sed -i "s/<version>.*<\/version>/<version>${NEW_VERSION}<\/version>/g" pom.xml
      fi
  script:
    - mvn clean package -DskipTests

注意事项

  1. 上述示例仅在构建过程中临时修改pom版本,不会将修改提交回代码库(避免触发循环流水线)
  2. 多模块项目优先使用Maven Versions插件,它会自动同步所有子模块的版本号
  3. 可以根据实际分支命名规则调整正则表达式(如^project/task-)
  4. CI_PIPELINE_IID是项目全局递增的,若需要按release分支单独计数,可结合Gitlab CI的变量自定义逻辑(如用标签或存储文件记录计数,但复杂度较高)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:33:22