如何在Jenkins前置Shell脚本中获取maven-release-plugin的发布版本
我明白你遇到的困境了——在Jenkins的Maven Release任务里,启用了「在SCM运行前执行构建步骤」的Shell脚本,但死活拿不到发布版本,试了$releaseVersion也没用,只能看到Maven命令里带着-DdevelopmentVersion参数对吧?
其实核心原因是:maven-release-plugin计算出的releaseVersion默认不会暴露为Jenkins的环境变量,而且在「Pre SCM步骤」这个阶段,插件还没把这些版本变量传递给Shell的执行环境,直接用$releaseVersion自然拿不到值。
下面给你几个实用的解决方案,根据你的场景选就行:
方法一:自动解析当前POM版本生成Release版本(适用于默认版本规则)
如果你的Release版本就是当前POM里的SNAPSHOT版本去掉-SNAPSHOT后缀(比如0.0.33-SNAPSHOT对应0.0.33),可以直接在Shell脚本里用Maven命令提取并处理:
# 从POM中读取当前版本,去掉-SNAPSHOT得到Release版本 RELEASE_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout | sed 's/-SNAPSHOT//') # 验证一下结果 echo "即将发布的版本是:$RELEASE_VERSION"
这个方法简单直接,但如果是手动指定了非默认的Release版本(比如跳过自动递增,手动输入了一个不同的版本号),就会失效。
方法二:通过Dry-Run生成配置文件读取真实Release版本(通用场景)
不管你是让插件自动生成版本,还是手动指定版本,这个方法都能拿到准确的Release版本——先让maven-release-plugin执行一次模拟准备(dry-run),生成包含版本信息的release.properties文件,再从中提取值:
# 执行dry-run,模拟release:prepare过程,生成release.properties mvn release:prepare -DdryRun=true -DskipTests # 从生成的配置文件中提取Release版本 RELEASE_VERSION=$(grep 'release.version' target/checkout/release.properties | cut -d'=' -f2) echo "获取到的Release版本:$RELEASE_VERSION" # 可选:清理dry-run生成的临时文件,避免影响后续正式发布流程 mvn release:clean
这个方法的优势是能精准获取插件最终确定的Release版本,完全匹配后续正式发布的版本号,唯一要注意的是执行完dry-run后记得清理临时文件。
方法三:Pipeline任务中的变量捕获(如果用Jenkins Pipeline)
如果你的Jenkins任务是Pipeline类型,可以直接在调用Maven Release插件时捕获releaseVersion变量,然后传递给前置脚本:
def releaseVersion stage('Maven Release') { mavenRelease { // 这里可以手动指定版本,或者留空让插件自动生成 releaseVersion('1.0.0') // 配置前置SCM步骤 preScmSteps { shell script: "echo 准备发布版本:${releaseVersion}" } // 其他Release配置... } }
这个方式更贴合Pipeline的流程,变量传递也更直接,但只适用于Pipeline任务,自由风格任务用前面两种方法更合适。
内容的提问来源于stack exchange,提问作者animesh143

