Jenkins Pipeline执行Maven命令报错pom.xml找不到问题求助
问题原因
- Maven执行时默认读取当前工作目录下的
pom.xml,你的项目代码放在工作空间的java-maven-app-master-increment子目录,pom文件不在Jenkins任务默认的工作空间根路径,直接跑mvn命令自然会报找不到POM的错。 - 之前试的
sh "cd java-maven-app-master-increment"没用,核心原因是Jenkins Pipeline里每一个sh步骤都会启动独立的shell进程,cd操作只在当前这个sh进程里生效,进程跑完就销毁了,后面的sh命令、文件读取操作还是会回到工作空间根目录执行,等于切目录的操作根本没传到后续步骤。
修复方法
推荐用声明式Pipeline自带的dir步骤切换工作目录,这个步骤包裹的代码块里,所有操作(包括sh命令、文件读写)都会以指定目录为根路径,不容易出错。
修正后的完整流水线脚本如下:
pipeline { agent any tools { maven "maven-3.6" } stages { stage('Increment Version') { steps { // 块内所有操作都会切换到项目根目录执行 dir('java-maven-app-master-increment') { script { echo 'incrementing app version...' sh 'mvn build-helper:parse-version versions:set \ -DnewVersion=\\\${parsedVersion.majorVersion}.\\\${parsedVersion.minorVersion}.\\\${parsedVersion.nextIncrementalVersion} \ versions:commit' def matcher = readFile('pom.xml') =~ '<version>(.+)</version>' def version = matcher[0][1] env.IMAGE_NAME = "$version-$BUILD_NUMBER" } } } } stage('Build App') { steps { dir('java-maven-app-master-increment') { script{ echo 'Building the Application' sh "mvn package" } } } } stage('Deploying Step') { steps { echo 'Deploy the App' } } } }
如果不想用dir步骤,也可以在所有mvn命令中加-f参数指定pom文件的相对路径,读pom文件的时候也补全路径,示例写法:
// 版本自增时指定pom路径 sh 'mvn -f java-maven-app-master-increment/pom.xml build-helper:parse-version versions:set \ -DnewVersion=\\\${parsedVersion.majorVersion}.\\\${parsedVersion.minorVersion}.\\\${parsedVersion.nextIncrementalVersion} \ versions:commit' // 读取文件时补全相对路径 def matcher = readFile('java-maven-app-master-increment/pom.xml') =~ '<version>(.+)</version>' // 构建命令同样指定pom路径 sh "mvn -f java-maven-app-master-increment/pom.xml package"
这种写法需要每一处涉及项目文件的操作都手动补路径,很容易漏,优先选dir步骤的方案。
内容的提问来源于stack exchange,提问作者Zeynal
相关产品推荐
相关产品推荐

