当我在 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"
我在最后的结束 ' 之前删除了\。这也奏效了。
最佳答案
这里的问题是您正在使用三层解释器和编译器,并且都使用相同的语法来进行字符串中的变量替换:“${myvar}”。
- 首先是 Groovy,它会给你一个糟糕的替换,因为它不知道任何名为
parsedVersion.minorVersion
的变量。 。您可以使用'
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:
sh 'mvn build-helper:parse-version versions:set \
-DnewVersion=\'${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion}-SNAPSHOT\' \
-DgenerateBackupPoms=false \
-DprocessAllModules \
-DgenerateBackupPoms=false'
关于maven - 在 Jenkins 管道中使用 Maven 版本插件升级版本时出现错误替换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52399604/