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

GitLab CI同一Job中如何根据Tag执行不同Maven脚本?

解决方案

问题分析

你之前的配置存在几个核心问题:

  • rules 块语法错误,无法直接在 when 后赋值变量,需要通过 rules.variables 字段覆盖变量
  • MAVEN_CLI_OPTS 的引号未闭合(末尾的 'warn 缺少闭合单引号)
  • docker save 命令中镜像名前后不一致(前面是 candy-manager,后面误写为 track-history-manager)

正确配置示例

以下是修正后的完整配置,实现Tag提交时用CI_COMMIT_TAG作为版本,普通提交用pom.xml中的快照版本:

variables:
  # 修复引号闭合问题的基础Maven命令参数
  MAVEN_CLI_OPTS: "-s $CI_PROJECT_DIR/.m2/settings.xml --batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=false -DdeployAtEnd=false -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener='warn'"

package:
  stage: package
  extends: .jdk_in_dind
  rules:
    # Tag提交时,覆盖MAVEN_CLI_OPTS添加版本设置命令
    - if: '$CI_COMMIT_TAG != ""'
      variables:
        MAVEN_CLI_OPTS: "-s $CI_PROJECT_DIR/.m2/settings.xml --batch-mode versions:set -DnewVersion=${CI_COMMIT_TAG} --errors --fail-at-end --show-version -DinstallAtEnd=false -DdeployAtEnd=false -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener='warn'"
    # 非Tag提交保持默认变量
    - if: '$CI_COMMIT_TAG == ""'
      when: always
  script:
    - ./builddockerimage.sh -a
    # 提取镜像标签并统一镜像名,避免重复执行docker命令
    - IMAGE_TAG=$(docker images candy-manager --format "{{.Tag}}")
    - docker save -o candy-manager-docker-image-${IMAGE_TAG}.tgz candy-manager:${IMAGE_TAG}
    - chmod 777 candy-manager-docker-image-${IMAGE_TAG}.tgz
    # 执行Maven打包
    - mvn clean ${MAVEN_CLI_OPTS} package
    - ls -la target
  artifacts:
    paths:
      - candy-manager-*.tgz
      - target/candy-manager*.jar
  only:
    - merge_requests
    - develop
    - tags
    - prod

另一种可选方案(脚本内判断)

如果不想通过rules覆盖变量,也可以在script中直接判断是否为Tag提交,动态执行不同的Maven命令:

variables:
  MAVEN_CLI_OPTS: "-s $CI_PROJECT_DIR/.m2/settings.xml --batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=false -DdeployAtEnd=false -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener='warn'"

package:
  stage: package
  extends: .jdk_in_dind
  script:
    - ./builddockerimage.sh -a
    - IMAGE_TAG=$(docker images candy-manager --format "{{.Tag}}")
    - docker save -o candy-manager-docker-image-${IMAGE_TAG}.tgz candy-manager:${IMAGE_TAG}
    - chmod 777 candy-manager-docker-image-${IMAGE_TAG}.tgz
    # 根据是否存在Tag执行不同打包逻辑
    - if [ -n "$CI_COMMIT_TAG" ]; then
        mvn clean versions:set -DnewVersion=${CI_COMMIT_TAG} ${MAVEN_CLI_OPTS} package;
      else
        mvn clean ${MAVEN_CLI_OPTS} package;
      fi
    - ls -la target
  artifacts:
    paths:
      - candy-manager-*.tgz
      - target/candy-manager*.jar
  only:
    - merge_requests
    - develop
    - tags
    - prod

关键说明

  1. 版本控制逻辑:Tag提交时通过versions:set临时修改pom.xml版本为CI_COMMIT_TAG,打包生成对应版本的jar;普通提交直接使用pom.xml中定义的快照版本。
  2. 镜像命令修复:统一docker save中的镜像名为candy-manager,避免镜像找不到的错误。
  3. 效率优化:用IMAGE_TAG变量存储镜像标签,减少重复执行docker images命令的开销,同时提升脚本可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:05:27