GitLab CI中maven-release-plugin二次执行报无SNAPSHOT项目错误
问题原因
报错的核心触发逻辑从构建日志可直接定位:
- 首次手动推送代码触发流水线时,本地pom.xml里的版本是
1.12-SNAPSHOT,符合maven-release-plugin执行release:prepare的前置要求(必须在SNAPSHOT版本上才能启动发版流程),所以第一次执行成功。 - maven-release-plugin执行过程中会自动向远程仓库推送2次提交:
- 第一次提交:将pom版本从
1.12-SNAPSHOT改为正式发布版1.11,打对应tag,提交信息默认是[maven-release-plugin] prepare release phoenix-1.11 - 第二次提交:将pom版本改为下一个开发迭代的
1.12-SNAPSHOT,提交信息是你配置的带[skip ci]的内容,这次提交触发的流水线会被GitLab CI直接跳过
- 第一次提交:将pom版本从
- 失败的流水线就是上述第一次自动提交触发的:
- 你在before_script里执行
git checkout -B "$CI_COMMIT_REF_NAME"之后没有拉取最新远程代码,日志里明确提示Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded - 此时流水线工作区里的pom.xml版本是正式版
1.11,不带-SNAPSHOT后缀,release:prepare启动时检查reactor项目列表,找不到任何SNAPSHOT版本的项目,直接抛出你看到的报错。
- 你在before_script里执行
- 额外配置问题:你在release任务的脚本里把
clean deploy和release:prepare release:perform放在同一条命令里执行属于重复操作,release:perform本身就会完成正式包的部署逻辑,提前跑deploy会多部署一次错误触发场景下的正式版包。另外pom里的scm地址多了一层不必要的双引号,后续可能引发git路径解析错误。
修复方案
按以下步骤调整配置即可彻底解决问题:
- 修正pom.xml中maven-release-plugin的配置,给正式版发布的自动提交也加上
[skip ci]标记,避免无意义的流水线触发,同时修正scm地址的多余引号:<scm> <developerConnection>scm:git:${project.scm.url}</developerConnection> <!-- 去掉myuser外层的双引号 --> <url>git@gitlab.com:myuser/phoenix.git</url> <tag>HEAD</tag> </scm> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>${maven.release.plugin}</version> <configuration> <scmDevelopmentCommitComment>@{prefix} prepare for next development iteration [skip ci]</scmDevelopmentCommitComment> <!-- 新增这行,给发布提交加skip ci标记 --> <scmReleaseCommitComment>@{prefix} prepare release [skip ci]</scmReleaseCommitComment> </configuration> </plugin> - 调整gitlab-ci.yml中release-job的逻辑:
- 在checkout分支之后新增拉取最新代码的步骤,解决本地分支落后远程的问题
- 删除mvn命令中多余的
clean deploy,避免重复部署 - 增加兜底规则,直接跳过maven-release-plugin自动提交触发的release任务
调整后的release-job配置参考:
release-job: image: $MAVEN_IMAGE stage: release tags: - local-runner # 兜底规则,跳过插件自动提交触发的任务 rules: - if: $CI_COMMIT_BRANCH == 'master' && $CI_COMMIT_MESSAGE !~ /\[maven-release-plugin\]/ before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - mkdir -p ~/.ssh - chmod 700 ~/.ssh - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' - apt-get update -qq - apt-get install -qq git - git config --global user.email "hidden" - git config --global user.name "hidden" - git checkout -B "$CI_COMMIT_REF_NAME" # 新增拉取最新代码步骤 - git pull origin "$CI_COMMIT_REF_NAME" script: - echo "Creating the release" # 移除多余的clean deploy,release插件会自动完成部署 - mvn $MAVEN_CLI_OPTS release:prepare release:perform
调整完成后,maven-release-plugin生成的两个自动提交都会带[skip ci]标记,不会触发多余的流水线;就算标记失效,兜底的规则也会跳过插件自动提交触发的发版任务,不会再出现版本不匹配的报错。
内容的提问来源于stack exchange,提问作者Gfalco
相关产品推荐
相关产品推荐

