Сохранение IP-адреса экземпляра AWS в переменную в скрипте groovy завершается неудачно - PullRequest
0 голосов
/ 19 февраля 2019

Задача:

У меня есть отличный сценарий, выполняющий несколько экземпляров AWS в качестве узлов параллельно с включенными SSH и HTTP группой безопасности.Общедоступный IPv4 доступен из экземпляра через http://169.254.169.254/latest/meta-data/public-ipv4.Мне нужно сохранить выходные данные этого запроса в переменной для дальнейшего использования.

То есть, как мой текущий код выглядит (на узле):

String ip = sh([returnStdout: true, label: 'save ip', script: 'curl -s http://169.254.169.254/latest/meta-data/public-ipv4']).toString().trim()
println("Status:", ip)

Сборка завершается с ERROR: script returned exit code 1.

Неудачные эксперименты:

Я попытался:

sh label: 'save ip', script: 'wget -qO ipv4.txt http://169.254.169.254/latest/meta-data/public-ipv4'
String ip = readFile 'ipv4.txt'
println("Status:", ip)

, и теперь он тоже не работает с ERROR: script returned exit code 1, но в readFile.Я даже пытался переместить часть readFile в коде вниз, и он прошел все шаги после sh до readFile.Если я только запускаю часть sh без сохранения вывода в переменную или чтения файла, сборка завершается успешно (или настолько успешно, насколько это возможно без этой информации).Пример вывода консоли ниже:

+ curl -s http://169.254.169.254/latest/meta-data/public-ipv4
18.202.253.1[Pipeline] unstash
[Pipeline] sh

Я проверил:

  • , существует ли файл (он существует)
  • содержимое файла (что-то вроде: 34.244.77.254 без перевода строки)
  • вывод URL (что-то вроде: 34.244.77.254 без перевода строки)
  • вывод sh с returnStatus (сумасшедшая вещь, яв этом случае получил IP на консольном журнале, и сборка все еще не удалась с выходом 1)

Я также попытался (только для проверки, подозревая некоторую ошибку при наличии возвращаемого значения IP):

sh label: 'save ip', script: 'wget -qO ipv4.txt http://169.254.169.254/latest/meta-data/ami-id'
String ip = readFile 'ipv4.txt'
println("Status:", ip)

и он вел себя как с public-ipv4.

Дополнительная информация о настройке:

  • Jenkins 2.150.3 LTS
  • Плагин Amazon EC2 1.42
  • Запущены изображения AMI Ubuntu 16.04LTS, Ubuntu 18.04LTS, Debian 9.7

Я благодарен за любые идеи.Я немного застрял здесь, и ни StackOverflow, ни Google не вернули никаких результатов.

Редактировать

Что касается комментария @JRichardsz, я пытался:

String ip = sh([returnStatus: true, label: 'save ip', script: 'curl -s ipv4.txt https://www.google.com']).toString().trim()
println("Status:", ip)

и получил ERROR: script returned exit code 1 тоже.

1 Ответ

0 голосов
/ 20 февраля 2019

Решение

tl; др : Дьявол был в деталях.Вот рабочий фрагмент:

String ip = sh([returnStdout: true, label: 'save ip', script: 'curl -s http://169.254.169.254/latest/meta-data/public-ipv4']).toString().trim()
println(ip)

Бдительный наблюдатель заметит, что изменилась только вторая строка.Да, println в Groovy хочет только один аргумент и не объединяет их, как, например, в Python.

Длинная версия : я попытался снова с этим фрагментом:

def ip = sh returnStdout: true, script: "date"
println("Status:", ip)

на локальной машине - просто чтобы быть уверенным, returnStdout работает вообще - и получил:

java.lang.NoSuchMethodError: No such DSL method 'println' found among steps [<java stack trace goes here ... ]

Так что ошибка не была внутри shвообще.

Наконец, я могу сказать, что трассировка стека Java, появляющаяся также во время выполнения Groovy на узлах AWS, могла бы помочь в этом вопросе.

Спасибо всем, кто прочитална этот вопрос и постарались найти ответ!

...