Почему этот отличный код работает по-другому в сценарии конвейера jenkins? - PullRequest
1 голос
/ 03 мая 2019

У меня есть фрагмент кода, который прекрасно работает во всех известных мне интерпретаторах, включая консоль сценариев Jenkins.И все же это странное поведение, когда дело доходит до конвейерных скриптов.

def kvs = ['key1': 'value1', 'key2': 'value2']
println kvs
println kvs.inject(''){ s,k,v -> s+= "{'$k': '$v' } "}

Прежде всего, карта печатается по-другому:

  • Ожидается : [key1:value1, key2:value2]
  • Получено : {key1=value1, key2=value2}

Тогда, более проблемный, полученный результат резко отличается:

  • Ожидается : {'key1': 'value1' } {'key2': 'value2' }
  • Получено : null

Оба эти результата были получены с использованием следующей версии Groovy: 2.4.12.(Хотя, кроме сценария конвейера, я также пробовал версии 2.4.6 и 2.4.15 и всегда получал ожидаемые результаты)

Обратите внимание, что меня не интересуют обходные пути.Я только хочу понять, почему поведение изменилось с обычного groovy на конвейерный скрипт.

1 Ответ

1 голос
/ 03 мая 2019

Это происходит потому, что конвейерный код Jenkins на самом деле не запускает этот код Groovy напрямую, а интерпретирует его с помощью синтаксического анализатора, чтобы применить безопасность сценариев для обеспечения безопасности системы Jenkins, помимо прочего.Процитируем: «Код конвейера написан как Groovy, но модель выполнения радикально преобразуется во время компиляции в стиль продолжения передачи (CPS)».- смотрите лучшие практики https://jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice/. Короче говоря, не пишите сложный код Groovy в своих конвейерах - попробуйте использовать стандартные шаги, предоставляемые конвейерным DSL или плагинами.Простой Groovy-код в разделах скрипта может быть полезен в некоторых случаях.В настоящее время я помещаю некоторые из моих более сложных вещей в плагины, которые предоставляют пользовательские шаги.

...