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

标签 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'

这是本例中的错误消息 -

[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}”。

  1. 首先是 Groovy,它会给你一个糟糕的替换,因为它不知道任何名为 parsedVersion.minorVersion 的变量。 。您可以使用' 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:

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/

相关文章:

Jenkins :如何捕获stderr输出

Jenkins 管道 ansicolor 控制台输出

maven - jgitflow :release-finish is not deleting the release branch

git - 无法执行 Maven 发布

maven - 如何有条件地运行maven-release :rollback in jenkins?

maven - giraph格式-建立具有依赖项的jar

java - Tomcat - Eclipse 中的服务器

jenkins - 使用默认 Jenkins 管道同时构建 2 个作业

java - Jersey-Spring3 maven依赖问题

android - 在根项目 'bintrayUpload' 中找不到任务 'bin'