Подтвердить что ты не робот

Каково влияние на @NonCPS в трубопроводе Дженкинса script

У меня есть трубопровод script в Дженкинсе.

Я использовал это исключение:

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

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

После этого, однако, исключение, которое я выбрал в этом методе, больше не было захвачено предложением try.

И что за идея @NonCPS? Каковы последствия его использования?

4b9b3361

Ответ 1

Исключение, которое вы видите, связано с script безопасностью и песочницей. В принципе, по умолчанию при запуске конвейера script он запускается в песочнице, которая позволяет использовать только определенные методы и классы. Есть способы для операций с белыми списками, проверьте ссылку выше.

Аннотация @NonCPS полезна, когда у вас есть методы, которые используют объекты, которые не могут быть сериализованы. Как правило, все объекты, которые вы создаете в конвейере script, должны быть сериализуемыми (причина этого в том, что Дженкинс должен иметь возможность сериализовать состояние script, чтобы его можно было приостановить и сохранить на диске).

Когда вы ставите @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();

Вся печать "Поймано", как ожидалось.