2

在我的 jenkins 管道中运行此命令时出现错误的替换错误

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

这是这种情况下的错误消息 -

[代码] 运行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

[代码] 运行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"

我在最后关闭 ' 之前删除了 \ 。这也奏效了。

4

1 回答 1

4

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

  1. 首先是 Groovy,因为它不知道任何名为parsedVersion.minorVersion. 您可以使用's 而不是"s 来防止 Groovy 尝试这样做或$使用s 转义\。然而,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'
于 2018-09-19T07:46:20.057 回答