A exceção que você está vendo é devido à segurança do script e ao sandbox. Basicamente, por padrão, quando você executa um script de pipeline, ele é executado em uma caixa de proteção que só permite o uso de determinados métodos e classes. Existem maneiras de colocar operações na lista de permissões, verifique o link acima.
A @NonCPS
anotação é útil quando você tem métodos que usam objetos que não são serializáveis. Normalmente, todos os objetos que você cria no script do pipeline devem ser serializáveis (a razão para isso é que o Jenkins deve ser capaz de serializar o estado do script para que possa ser pausado e armazenado no disco).
Quando você coloca @NonCPS
um método, o Jenkins executa o método inteiro de uma vez, sem a capacidade de fazer uma pausa. Além disso, você não tem permissão para fazer referência a nenhuma etapa do pipeline ou métodos transformados CPS de dentro de um @NonCPS
método anotado. Mais informações sobre isso podem ser encontradas aqui .
Quanto ao tratamento de exceções: Não tenho 100% de certeza do que está ocorrendo; Tentei o seguinte e funcionou conforme o esperado:
@NonCPS
def myFunction() {
throw new RuntimeException();
}
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
e
@NonCPS
def myFunction() {
throw new RuntimeException();
}
def mySecondFunction() {
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
}
mySecondFunction();
e finalmente:
@NonCPS
def myFunction() {
throw new RuntimeException();
}
@NonCPS
def mySecondFunction() {
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
}
mySecondFunction();
Todos imprimem "Pego" conforme o esperado.