Ошибка неверной замены при увеличении версии с помощью плагина maven version в конвейере Jenkins

Я получаю ошибку подстановки при запуске этой команды в моем конвейере jenkins

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

Это сообщение об ошибке в данном случае -

[code] Запуск скрипта оболочки

/apps/jenkins/latest/workspace/ess-holani_master-3YNVBB6LFQA3QFK5NHYV57DW5HGSNALVGFJTJ4D6T72QVPJG4CDA/code@tmp/durable-374bc417/script.sh: parion {{parsion} {V.} {V..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 при запуске вышеуказанной команды

[code] Запуск скрипта оболочки

mvn build-helper:parse-version version:set '-DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion}-SNAPSHOT' -DgenerateBackupPoms=falseMDoBodesAll =

Использование двойных кавычек также работает здесь -

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"

Я удалил \ до закрытия "в конце. Это тоже сработало.

1 ответ

Решение

Проблема здесь в том, что вы используете три уровня интерпретаторов и компиляторов, и все они используют один и тот же синтаксис для подстановки переменных в строках: "${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'