2017-02-15 2 views
0

я сократил некоторые неожиданное поведение (для меня) в Дженкинс Pipeline заводной к следующему: Создание проекта Дженкинс трубопроводов со следующим кодом сценария:Неожиданное поведение в Дженкинс Pipeline Groovy: .each не переборе

def a = ['a','b','c'] 
def ctx = [ alljobs: a ] 
def say(s) {println "$s"} 

@NonCPS 
def fn(ctx) { 
    say "ctx.alljobs=$ctx.alljobs" 
    ctx.alljobs.each { j -> say "$j" } 
    say "done" 
} 
say "before fn()" 
fn(ctx) 
say "after fn()" 

Когда я выполняю это в Groovy переводчика за пределами Дженкинс (менее @NonCPS), я получаю выход я ожидал:

before fn() 
ctx.alljobs=[a, b, c] 
a 
b 
c 
Done. 
after fn() 

Когда я запускаю работу Дженкинс трубопроводов я вижу следующее:

Started by user John Elion (john.elion) 
[Pipeline] echo 
before fn() 
[Pipeline] echo 
ctx.alljobs=[a, b, c] 
[Pipeline] echo 
after fn() 
[Pipeline] End of Pipeline 
Finished: SUCCESS 

.each не выполняется вообще (я также видел, как он выполнялся один раз - это то, что побудило меня попытаться свести к простому фрагменту кода), и функция отбрасывается - скажем, после того, как цикл не печатается, но высказывается после завершения функции.

Я попытался обернуть различные блоки в try-catch, чтобы увидеть, произошло ли исключение, но не повезло. Я что-то упускаю? Неужели я ошибаюсь, ожидая поведения, которое я вижу в отличном переводчике за пределами Дженкинса?

Ошибка трубопровода? Или я чего-то не хватает?

Я выполняю Jenkins v2.44. Это плотно закрытая среда; Я знаю, что он работает на каком-то Linux; Я считаю, что у меня есть Workflow-cps Pipeline: Groovy 'v.2.26, и я не уверен, какие другие конвейеры или другие плагины имеют отношение.

спасибо.

ответ

0

Простой ответ: «say» должен быть @NonCPS. Затем он работает так, как ожидалось.

Причина, по которой выглядит исключение, заключается в том, что @NonCPS реализована для исключения исключения, которое поймано и обработано внутренне. Для получения технических подробностей см. https://github.com/jenkinsci/workflow-cps-plugin/blob/master/README.md.

Кажется, интерпретатор должен поднять пользовательскую ошибку видимых, когда функция @NonCPS вызывает функцию CPS с поддержкой, а не молча прерывание функции и перейти к трубопроводу ...

+2

Одна из нескольких ситуаций где Дженкинс не предоставляет достаточной информации (или любой), если вы сделали что-то не так в своем скрипте. –

Смежные вопросы