Jenkins에 파이프 라인 스크립트가 있습니다.
이 예외가 발생했습니다.
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException : 스크립트는 groovy.json.JsonSlurperClassic parseText java.lang.String 메소드를 사용할 수 없습니다.
예외를 찾아 보았고 예외가 발생하는 메서드에 주석을 추가해야한다는 표시를 찾았습니다 @NonCPS
. 나는 이것이 무엇을하는지 정말로 이해하지 않고 이것을했다.
그러나 그 후 해당 메서드에서 던진 예외는 더 이상 try
절에 의해 포착되지 않았습니다 .
그래서 뒤에 아이디어는 @NonCPS
무엇입니까? 그것을 사용하면 어떤 효과가 있습니까?
답변
표시되는 예외는 스크립트 보안 및 샌드 박싱 때문입니다. 기본적으로 파이프 라인 스크립트를 실행하면 특정 메서드와 클래스 만 사용할 수있는 샌드 박스에서 실행됩니다. 작업을 허용 목록에 추가하는 방법이 있습니다. 위 링크를 확인하세요.
@NonCPS
당신이 직렬화 가능하지 않은 객체를 사용하는 방법이있을 때 주석에 유용합니다. 일반적으로 파이프 라인 스크립트에서 생성하는 모든 객체는 직렬화 가능해야합니다 (그 이유는 Jenkins가 스크립트 상태를 직렬화 할 수 있어야 디스크에 일시 중지되고 저장 될 수 있기 때문입니다).
당신이 넣을 때 @NonCPS
방법에, 젠킨스 일시 중지 할 수없이 한 번에 전체 방법을 실행합니다. 또한 @NonCPS
주석이 추가 된 메서드 내에서 파이프 라인 단계 또는 CPS 변환 된 메서드를 참조 할 수 없습니다 . 이에 대한 자세한 내용은 여기에서 찾을 수 있습니다 .
예외 처리에 관해서 : 당신이 경험하고있는 것을 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();
모두 예상대로 “Caught”를 인쇄합니다.