Доступ к переменной Groovy (jenkinsfile) внутри блока sh подстановки команд - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть общий jenkinsfile (плагин Jenkins 2.0 конвейера), и я пытаюсь запустить «вложенную» команду curl внутри компонента скрипта:

                    def v = version()
                    def envId = environment()
                    def projectId = projectId()
                    def APIKey = xxx
                    sh "curl -H "Content-Type: application/json" -H "X-Octopus-ApiKey: "'$APIKey'" -d '{"ReleaseId":"'$(curl -H "Content-Type: application/json" -H "X-Octopus-ApiKey: "'$APIKey'" -d '{"version":"'$v'", "ProjectId":"'$projectId'", "Environment-Id":"'$envId'"}' http://xxxxx | grep '"Id":' | head -1 | cut -d ':' -f 2 | cut -d '"' -f 2)'", "EnvironmentId":"'$envId'"}' http://xxxxxx"

Как видите, я использую командуподстановка в команде curl для передачи значения ReleaseId.Нужно ли использовать другой способ для доступа к переменным, таким как envId, projectId и APIKey в части подстановки команды $ () моей команды curl?

Из предыдущего исследования я обертываю значения ихКлючи JSON в формате "$ somevar", однако я получаю стандартные ошибки, поскольку они не найдены.

Спасибо

1 Ответ

0 голосов
/ 29 ноября 2018

Проблема с вашим кодом в том, что вы не избегаете двойных кавычек в команде.Для Groovy строка, которая передается команде sh, заканчивается непосредственно перед Content-Type, если вы не экранируете двойные кавычки с обратной косой чертой.

Также вам нужно избегать знаков доллара, которые вы хотите интерпретировать с помощью Bash.Строковая интерполяция Groovy использует тот же синтаксис, что и Bash.

Я пытался исправить вашу команду.Надеюсь, я нашел все проблемы:

sh "curl -H \"Content-Type: application/json\" -H \"X-Octopus-ApiKey: \"'${APIKey}'\" -d '{\"ReleaseId\":\"'\$(curl -H \"Content-Type: application/json\" -H \"X-Octopus-ApiKey: \"'${APIKey}'\" -d '{\"version\":\"'${v}'\", \"ProjectId\":\"'${projectId}'\", \"Environment-Id\":\"'${envId}'\"}' http://xxxxx | grep '\"Id\":' | head -1 | cut -d ':' -f 2 | cut -d '\"' -f 2)'\", \"EnvironmentId\":\"'${envId}'\"}' http://xxxxxx"

Кстати, я положил переменные из groovy в фигурные скобки.В этом нет необходимости, но я считаю, что это хорошая практика.

...