使用Jenkins管道中的maven版本插件升级版本时出现错误的替换错误

问题描述 投票:1回答:1

我在jenkins管道中运行此命令时出现错误的替换错误

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

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

[code]运行shell脚本

/apps/jenkins/latest/workspace/ess-holani_master-3YNVBB6LFQA3QFK5NHYV57DW5HGSNALVGFJTJ4D6T72QVPJG4CDA/code@tmp/durable-374bc417/script.sh:line 2:-DnewVersion = $ {parsedVersion.majorVersion}。$ {parsedVersion.minorVersion}。$ {parsedVersion .nextIncrementalVersion} -SNAPSHOT:糟糕的替换

脚本返回退出代码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

[code]运行shell脚本

mvn build-helper:parse-version版本: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"

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

迈克尔作品提出的答案。

我也尝试过这个

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

我在最后关闭之前删除了\。这也有效。

maven jenkins-pipeline maven-release-plugin jenkins-groovy maven-versions-plugin
1个回答
2
投票

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

  1. 首先是Groovy,它会给你一个糟糕的替换,因为它不知道任何名为parsedVersion.minorVersion的变量。您可以使用's而不是"s来阻止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但不需要在$s上进行任何转义:

sh 'mvn build-helper:parse-version versions:set \
  -DnewVersion=\'${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion}-SNAPSHOT\' \
  -DgenerateBackupPoms=false \
  -DprocessAllModules \
  -DgenerateBackupPoms=false'
© www.soinside.com 2019 - 2024. All rights reserved.