【问题标题】:Getting bad substitution error when bumping up version using maven versions plugin in Jenkins pipeline在 Jenkins 管道中使用 Maven 版本插件升级版本时出现错误的替换错误
【发布时间】:2019-02-23 06:13:08
【问题描述】:

当我在我的 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: 第 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"

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

michael works 建议的答案。

我也试过了

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

我在结束 ' 之前删除了 \ 。这也奏效了。

【问题讨论】:

  • 在 Jenkins 管道中使用真正的单引号还是双引号?
  • 编辑了我要回答的问题。
  • 在不使用转义反斜杠时能否请您发布错误?
  • 你确定第二个例子('s 和\\\$)确实有效。在这种情况下,我假设 Maven 将版本设置为 \${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion}-SNAPSHOT(无替换)。
  • 编辑了我的问题以回答您的问题。是的,它确实可以使用 ' 和 \\\

标签: maven jenkins-pipeline maven-release-plugin jenkins-groovy maven-versions-plugin


【解决方案1】:

这里的问题是您使用了三层解释器和编译器,并且都使用相同的语法来进行字符串中的变量替换:“${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'

【讨论】:

  • 感谢您的解释。但是我在删除第二个“\${parsedVersion.nextIncrementalVersion}-SNAPSHOT'”之前的 \ 后尝试了相同的命令。这也奏效了。那么就不需要 \ 转义字符了?
  • @SharadHolani 我的错。也将其从答案中删除。一个不同的想法是在整个事情上使用's。在这种情况下,我们需要转义我们想传递给 Maven 的's。然而,我发现"s 版本的可读性稍好一些。
  • @SharadHolani 我添加了另一个没有$ 转义的版本,它应该也可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
相关资源
最近更新 更多