Не удается отобразить сценарий groovy sh с переменной среды, использующей jq

#jenkins #jq #aws-cli #amazon-emr #jenkins-groovy

Вопрос:

У меня здесь есть эта строка, которая находится внутри функции groovy, и я пытаюсь вернуть идентификатор кластера

 EMR_ID = sh(returnStdout: true, script: "aws emr list-clusters --active --profile '${PROFILE}' | jq -r '.Clusters[] | select (.Name=="'${ENV}'-emr-cluster") | .Id'")
 

Без переменных окружающей среды это работает нормально.
таким образом, параметр $PROFILE имеет значение dev, а параметр $ENV-aws-dev.

Я продолжаю получать ошибку, которая жалуется на параметр $ENV, говоря, что появляется неожиданная скобка

Комментарии:

1. Какова стоимость ${ENV}?

Ответ №1:

Редко бывает хорошей идеей передавать переменные среды с помощью интерполяции строк. Есть гораздо лучшие способы.

Один из них, который вы могли бы рассмотреть, — это изменение вашего вызова jq следующим образом:

 jq -r --arg env "${ENV}" '.Clusters[] | select (.Name=="($env)-emr-cluster") | .Id'
 

Здесь $env обычная переменная jq, или, точнее, возможно, определенная константа.

Комментарии:

1. Это отлично работает на терминале bash, но как заставить это работать над отличным сценарием? Мне нужно принять во внимание форматирование, которое должен выполнить groovy

Ответ №2:

Поняв, что генератор фрагментов Дженкинса действительно полезен, я использовал это:

 sh '''jq -r --arg env "${ENV}" '.Clusters[] | select (.Name=="\($env)-emr-cluster") | .Id' '''
 

и это сработало!