2017-02-17 5 views
30

У меня есть сценарий конвейера в Jenkins.Что влияет на @NonCPS в сценарии сценария Jenkins

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

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

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

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

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

ответ

37

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

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

Когда вы положите @NonCPS по методу, Дженкинс выполнит весь метод за один раз без возможности паузы. Кроме того, вам не разрешено ссылаться на любые шаги трубопровода или методы, преобразованные CPS, из аннотированного метода @NonCPS. More information about this can be found here.

Что касается обработки исключений: не 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(); 

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

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