2017-02-17 12 views
30

Mam skrypt rurociągu w Jenkins.Jaki jest wpływ na @NonCPS w skrypcie potoku Jenkinsa

użyłem, aby uzyskać ten wyjątek:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Skrypty nie dopuszcza się stosowanie metody groovy.json.JsonSlurperClassic parseText java.lang.String

Sprawdziłem wyjątek i znalazłem kilka wskazań, że powinienem opisać metodę, w której występuje wyjątek z @NonCPS. Zrobiłem to, nie rozumiejąc dokładnie, co to robi.

Po tym jednak wyjątek, który rzuciłem w tę metodę, nie został już złapany przez klauzulę try.

Więc jaki jest pomysł za @NonCPS? Jakie są efekty korzystania z niego?

Odpowiedz

37

Wyjątek, który widzisz, wynika z script security i piaskownicy. Zasadniczo domyślnie, po uruchomieniu skryptu potoku działa on w piaskownicy, która zezwala tylko na użycie pewnych metod i klas. Istnieją sposoby na operacje na białej liście, sprawdź powyższy link.

Adnotacja jest przydatna, gdy istnieją metody wykorzystujące obiekty, które nie mogą być przekształcane do postaci szeregowej. Zwykle wszystkie obiekty tworzone w skrypcie potoku muszą być przekształcalne do postaci szeregowej (powodem tego jest to, że Jenkins musi być w stanie szeregować stan skryptu, aby można go było zatrzymać i zapisać na dysku).

Po umieszczeniu @NonCPS dla metody, Jenkins wykona całą metodę za jednym razem bez możliwości zatrzymania. Ponadto nie można odwoływać się do żadnych etapów procesu lub metod przekształcania CPS z metody opatrzonej komentarzem w postaci @NonCPS. More information about this can be found here.

Jeśli chodzi o obsługę wyjątków: Nie jesteś w 100% pewien, czego doświadczasz; Próbowałem następujące i działa zgodnie z oczekiwaniami:

@NonCPS 
def myFunction() { 
    throw new RuntimeException(); 
} 

try { 
    myFunction(); 
} catch (Exception e) { 
    echo "Caught"; 
} 

i

@NonCPS 
def myFunction() { 
    throw new RuntimeException(); 
} 

def mySecondFunction() { 
    try { 
     myFunction(); 
    } catch (Exception e) { 
     echo "Caught"; 
    } 
} 

mySecondFunction(); 

i wreszcie:

@NonCPS 
def myFunction() { 
    throw new RuntimeException(); 
} 

@NonCPS 
def mySecondFunction() { 
    try { 
     myFunction(); 
    } catch (Exception e) { 
     echo "Caught"; 
    } 
} 

mySecondFunction(); 

Wszystko print "Caught" zgodnie z oczekiwaniami.

Powiązane problemy