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
关键说明
- 版本控制逻辑:Tag提交时通过
versions:set临时修改pom.xml版本为CI_COMMIT_TAG,打包生成对应版本的jar;普通提交直接使用pom.xml中定义的快照版本。 - 镜像命令修复:统一
docker save中的镜像名为candy-manager,避免镜像找不到的错误。 - 效率优化:用
IMAGE_TAG变量存储镜像标签,减少重复执行docker images命令的开销,同时提升脚本可读性。
内容的提问来源于stack exchange,提问作者webBuilder
相关产品推荐
相关产品推荐

