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

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

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

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

[код] Запуск сценария оболочки

/apps/jenkins/latest/workspace/ess-holani_master-3YNVBB6LFQA3QFK5NHYV57DW5HGSNALVGFJTJ4D6T72QVPJG4CDA/code@tmp/durable-374bc417/script.sh: строка 2: -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minoredVersion. .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, когда я запускаю указанную выше команду

[код] Запуск сценария оболочки

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"

Я хочу понять, зачем нам нужно добавлять лишний '\\\' в этот скрипт?

Ответ, предложенный Майклом работает.

Я также пробовал это

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

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


person lostintranslation    schedule 19.09.2018    source источник
comment
используя действительно одинарные или двойные кавычки в конвейере Дженкинса?   -  person khmarbaise    schedule 19.09.2018
comment
Отредактировал мой вопрос, чтобы ответить.   -  person lostintranslation    schedule 19.09.2018
comment
Не могли бы вы опубликовать сообщение об ошибке, когда не используете экранированную обратную косую черту?   -  person fl0w    schedule 19.09.2018
comment
Вы уверены, что второй пример ('s с \\\$) действительно работал? Я предполагаю, что в этом случае Maven установил версию \${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion}-SNAPSHOT (без замен).   -  person Michael    schedule 19.09.2018
comment
Отредактировал мой вопрос, чтобы ответить на ваш вопрос. И да, он работает, как и ожидалось, с ' и \\\   -  person lostintranslation    schedule 19.09.2018


Ответы (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'
person Michael    schedule 19.09.2018
comment
Спасибо за объяснение. Но я попробовал ту же команду после удаления \ перед вторым ' \${parsedVersion.nextIncrementalVersion}-SNAPSHOT' . Это тоже сработало. Тогда символ \ escape не нужен? - person lostintranslation; 19.09.2018
comment
@ШарадХолани, мой плохой. Удалил его и из ответа. Другой идеей было бы использовать ' вокруг всего этого. В этом случае нам нужно избежать ', которые мы хотели бы передать Maven. Однако я нашел версию "s немного лучше читаемой. - person Michael; 19.09.2018
comment
@SharadHolani Я добавил еще одну версию без побегов $, которая тоже должна работать. - person Michael; 19.09.2018