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