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

GitLab CI中maven-release-plugin二次执行报无SNAPSHOT项目错误

问题原因

报错的核心触发逻辑从构建日志可直接定位:

  1. 首次手动推送代码触发流水线时,本地pom.xml里的版本是1.12-SNAPSHOT,符合maven-release-plugin执行release:prepare的前置要求(必须在SNAPSHOT版本上才能启动发版流程),所以第一次执行成功。
  2. 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直接跳过
  3. 失败的流水线就是上述第一次自动提交触发的:
    • 你在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版本的项目,直接抛出你看到的报错。
  4. 额外配置问题:你在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的逻辑:
    1. 在checkout分支之后新增拉取最新代码的步骤,解决本地分支落后远程的问题
    2. 删除mvn命令中多余的clean deploy,避免重复部署
    3. 增加兜底规则,直接跳过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:21:12