Jenkins

[Jenkins] RejectedAccessException - Scripts not permitted to use 해결

비번변경 2024. 8. 7. 11:28

현상

업무 중 Groovy 코드를 테스트하고 싶은 일이 생겼는데, Java Spring 기반 프로젝트라 단순 print 확인을 위한 프로젝트 세팅을 하기가 좀 번거로운 상황이다. 좀 간편하게 테스트할 방법을 생각해 보다가 Jenkins 파이프라인에서 Groovy 스크립트를 실행할 수 있는 것이 생각나 다음과 같은 코드로 시도해 보았는데……

import org.springframework.http.HttpHeaders
import org.springframework.http.MediaType
import java.nio.charset.Charset

CONTENT_TYPE = "application/json;charset=utf-8"
HttpHeaders headers_1 = new HttpHeaders()
headers_1.set("Content-type", CONTENT_TYPE)

pipeline {
    agent any
    stages {
        stage('Hello') {
            steps {
                echo "$headers_1"
            }
        }
    }
}

다음과 같은 에러와 함께 실패했다.

 

해결 방법을 적어본다,

 

 

원인

Jenkins와 여러 플러그인을 사용하면 Jenkins에서 Groovy 스크립트를 실행할 수 있다. 다만 기본적으로 Jenkins 파이프라인을 통해서 Groovy 스크립트를 실행하는 경우에는 악성 스크립트 실행을 방지하기 위해 내부 API 접근에 제한된 환경인 Groovy Sandbox에서 실행된다.

즉, 이번 오류는 실행한 Groovy 스크립트에 Groovy Sandbox에서 접근할 수 없는 API 접근이 포함되어 있어 발생한 오류다.

 

 

해결 방법

스크립트를 정상적으로 실행시키려면 Groovy Sandbox 없이 스크립트를 실행하거나 관리자로부터 실행할 스크립트를 승인받아야 한다. 이번 글에서는 Groovy Sandbox 없이 실행하는 방법만 적어둔다.

 

먼저 특정 Job의 Groovy Sandbox 사용을 비활성화할 때는 Job 구성 화면으로 이동한 뒤 하단 Pipeline 항목에서 Use Groovy Sandbox 체크박스를 해제하면 된다.

그리고 Approve script 버튼을 눌러 실행할 스크립트를 승인해 주어야 정상적으로 실행할 수 있다.

스크립트를 승인하면 다음과 같이 승인된 스크립트라고 표시된다.

참고로 스크립트를 변경할 때마다 승인해주어야 하면, Apply/Save를 해도 스크립트는 명시적으로 승인해주어야 한다.

 

 

참고 문서

https://www.jenkins.io/doc/book/managing/script-approval/

Jenkins CI Pipeline Scripts not permitted to use method groovy.lang.GroovyObject