Який ефект від @NonCPS у сценарії конвеєра Дженкінса


110

У мене є сценарій конвеєра в Дженкінсі.

Я раніше отримував цей виняток:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Скриптам не дозволено використовувати метод groovy.json.JsonSlurperClassic parseText java.lang.String

Я переглянув виняток вгору і виявив деякі вказівки, що мені слід анотувати метод, у якому відбувається виняток @NonCPS. Я це зробив, не розуміючи насправді, що це робить.

Після цього, однак, виключення, яке я кидав у цьому методі, більше не було сприйняте tryпунктом.

Отже, що за ідея @NonCPS? Які ефекти від його використання?


1
В офіційному блозі Дженкінса є стаття, яка представляє цю примітку та може допомогти вам. jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice
袁文涛

Відповіді:


141

Виняток, який ви бачите, пов’язаний із безпекою сценарію та пісочницею. В основному, за замовчуванням, коли ви запускаєте конвеєр конвеєра, він працює в пісочній скриньці, яка дозволяє використовувати лише певні методи та класи. Існують способи білого списку операцій, перевірте посилання вище.

@NonCPSАнотацію корисно , коли у вас є методи , які використовують об'єкти , які не є сериализации. Зазвичай всі об'єкти, які ви створюєте в сценарії конвеєра, повинні бути серіалізаційними (причина цього полягає в тому, що Дженкінс повинен мати можливість серіалізувати стан сценарію, щоб його можна було призупинити і зберігати на диску).

Коли ви @NonCPSзастосуєте метод, Дженкінс виконає весь метод за один раз без можливості зробити паузу. Крім того, вам не дозволяється посилатися на будь-які етапи трубопроводу або методи, трансформовані CPS, з @NonCPSметоду, що коментується. Більше інформації про це можна знайти тут .

Що стосується поводження з винятками: не на 100% впевнений, що ви відчуваєте; Я спробував наступне, і він працює як слід:

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

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

і

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

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

mySecondFunction();

і, нарешті:

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

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

mySecondFunction();

Весь друк "Зловив" як очікувалося.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.