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

Getting bad substitution error when bumping up version using maven versions plugin in Jenkins pipeline

当我在我的 jenkins 管道中 运行 这个命令时,我得到一个错误的替换错误

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

这是本例中的错误信息 -

[code] Running shell script

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

script returned exit code 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] Running shell script

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"

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

迈克尔作品建议的答案。

我也试过这个

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

我在结束时删除了 \ before the closing ' 。这也奏效了。

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

  1. 首先是 Groovy,这会给你一个错误的替换,因为它不知道任何名为 parsedVersion.minorVersion 的变量。您可以使用 's 而不是 "s 来防止 Groovy 尝试或使用 \ 转义 $。 Groovy 然而会将 $ 作为 $\$ 作为 $ 传递给下一个实例。
  2. 其次是Shell。同样,您可以选择使用 ' 或转义。
  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'