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
注意事项
- 上述示例仅在构建过程中临时修改pom版本,不会将修改提交回代码库(避免触发循环流水线)
- 多模块项目优先使用Maven Versions插件,它会自动同步所有子模块的版本号
- 可以根据实际分支命名规则调整正则表达式(如
^project/task-) CI_PIPELINE_IID是项目全局递增的,若需要按release分支单独计数,可结合Gitlab CI的变量自定义逻辑(如用标签或存储文件记录计数,但复杂度较高)
内容的提问来源于stack exchange,提问作者ChlnooL
相关产品推荐
相关产品推荐

