Jenkins 파이프 라인 스크립트에서 @NonCPS의 효과는 무엇입니까?


110

Jenkins에 파이프 라인 스크립트가 있습니다.

이 예외가 발생했습니다.

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException : 스크립트는 groovy.json.JsonSlurperClassic parseText java.lang.String 메소드를 사용할 수 없습니다.

예외를 찾아 보았고 예외가 발생하는 메서드에 주석을 추가해야한다는 표시를 찾았습니다 @NonCPS. 나는 이것이 무엇을하는지 정말로 이해하지 않고 이것을했다.

그러나 그 후 해당 메서드에서 던진 예외는 더 이상 try절에 의해 포착되지 않았습니다 .

그래서 뒤에 아이디어는 @NonCPS무엇입니까? 그것을 사용하면 어떤 효과가 있습니까?


1
jenkins 공식 블로그에는이 주석을 소개하고 도움이 될 수있는 기사가 있습니다. jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice
袁文涛

답변:


141

표시되는 예외는 스크립트 보안 및 샌드 박싱 때문입니다. 기본적으로 파이프 라인 스크립트를 실행하면 특정 메서드와 클래스 만 사용할 수있는 샌드 박스에서 실행됩니다. 작업을 허용 목록에 추가하는 방법이 있습니다. 위 링크를 확인하세요.

@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"를 인쇄합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.