在Jenkins管道中使用Maven版本插件提升版本时出现错误的替换错误

时间:2018-09-19 06:38:42

标签: maven jenkins-pipeline maven-release-plugin jenkins-groovy maven-versions-plugin

在我的jenkins管道中运行此命令时,我收到一个严重的替换错误

sh 'mvn build-helper:parse-version versions:set \
-DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion}-SNAPSHOT \
-DgenerateBackupPoms=false \
-DprocessAllModules \
-DgenerateBackupPoms=false'

在这种情况下,这是错误消息-

  

[代码]运行shell脚本

     

/apps/jenkins/latest/workspace/ess-holani_master-3YNVBB6LFQA3QFK5NHYV57DW5HGSNALVGFJTJ4D6T72QVPJG4CDA/code@tmp/durable-374bc417/script.sh:   第2行:   -DnewVersion = $ {parsedVersion.majorVersion}。$ {parsedVersion.minorVersion}。$ {parsedVersion.nextIncrementalVersion}-快照:   错误的替换

     

脚本返回了退出代码1

但这可行->

sh 'mvn build-helper:parse-version versions:set \
-DnewVersion=\\\${parsedVersion.majorVersion}.\\\${parsedVersion.minorVersion}.\\\${parsedVersion.nextIncrementalVersion}-SNAPSHOT \
-DgenerateBackupPoms=false \
-DprocessAllModules \
-DgenerateBackupPoms=false'

此命令可以按预期提高我的pom版本。

运行上述命令时登录jenkins shell

  

[代码]运行shell脚本

     

mvn build-helper:分析版本:set'-DnewVersion = $ {parsedVersion.majorVersion}。$ {parsedVersion.minorVersion}。$ {parsedVersion.nextIncrementalVersion} -SNAPSHOT'   -DgenerateBackupPoms = false -DprocessAllModules -DgenerateBackupPoms = false

在这里使用双引号也可以-

sh "mvn build-helper:parse-version versions:set \
-DnewVersion=\\\${parsedVersion.majorVersion}.\\\${parsedVersion.minorVersion}.\\\${parsedVersion.nextIncrementalVersion}-SNAPSHOT \
-DgenerateBackupPoms=false \
-DprocessAllModules \
-DgenerateBackupPoms=false"

我想了解为什么我们需要在此脚本中添加一个额外的'\\\'吗?

迈克尔·沃克斯(Michael Works)建议的答案。

我也尝试过

sh "mvn build-helper:parse-version versions:set \
-DnewVersion='\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion}-SNAPSHOT' \
-DgenerateBackupPoms=false \
-DprocessAllModules \
-DgenerateBackupPoms=false"

我在结尾处的\之前删除了\。这也起作用。

1 个答案:

答案 0 :(得分:2)

这里的问题是,您正在使用三层解释器和编译器,并且它们都使用相同的语法来替换字符串中的变量:“ $ {myvar}”。

  1. 首先是Groovy,由于它不知道任何名为parsedVersion.minorVersion的变量,因此会给您带来不好的替代。您可以使用'而不是"来防止Groovy尝试尝试使用$来逃避\。但是,Groovy会将\$作为$\\\$作为\$传递给下一个实例。
  2. 第二个是壳牌。同样,您可以选择使用'或转义。
  3. Maven,这就是您要替换的$

如果您在版本字符串中使用',我想可以减少混乱:

sh "mvn build-helper:parse-version versions:set \
  -DnewVersion='\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion}-SNAPSHOT' \
  -DgenerateBackupPoms=false \
  -DprocessAllModules \
  -DgenerateBackupPoms=false"

编辑:或者使用' s,所以我们需要转义',而无需对$ s进行任何转义:

sh 'mvn build-helper:parse-version versions:set \
  -DnewVersion=\'${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion}-SNAPSHOT\' \
  -DgenerateBackupPoms=false \
  -DprocessAllModules \
  -DgenerateBackupPoms=false'