ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 🛠️ Jenkins Pipeline: node vs pipeline 차이점과 Sandbox 오류 해결 방법
    IT 2025. 5. 22. 12:29
    반응형

    Jenkins에서 파이프라인을 구성하다 보면 두 가지 스타일이 존재한다는 것을 알게 됩니다: Scripted PipelineDeclarative Pipeline. 각각 node {}와 pipeline {}으로 시작되는 이 두 방식은 단순히 문법 차이 이상으로, 보안 정책, 확장성, 사용성에 있어 큰 차이를 가집니다.

    이번 글에서는 Scripted와 Declarative의 차이점, 그리고 Sandbox 오류 해결 사례를 중심으로 정리해보았습니다.


    ✅ Scripted vs. Declarative Pipeline 비교

    항목 Scripted Pipeline (node)  Declarative Pipeline (pipeline)
    구조 자유로운 Groovy 문법 엄격한 DSL 기반 문법
    학습 난이도 고급자에게 유리 초보자에게 친숙
    조건/반복문 자유롭게 가능 (if, for, try-catch) DSL 문법 내 제한적
    Jenkins 내부 접근 가능 (Jenkins.instance, rawBuild) 제한됨 (Sandbox 적용)
    보안 승인 필요 있음 (사용자 책임) 기본적으로 안전 (관리자 승인 적음)
    대표 키워드 node {} pipeline { agent any }

    ⚠️ 실제 발생한 오류: getRawBuild() Sandbox 차단

    Declarative Pipeline에서 다음 코드를 사용했을 때

    script {
        def prevBuild = currentBuild.rawBuild.getPreviousBuild()
    }
    

    다음과 같은 오류가 발생했습니다:

    Scripts not permitted to use method org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper getRawBuild
    

    이것은 Jenkins의 Script Security Plugin이 getRawBuild() 메서드를 Sandbox 외부 접근으로 간주하고 실행을 차단한 것입니다.


    🧩 해결 방법

    ✅ 1. 관리자 승인

    • Jenkins 관리자 계정으로 Manage Jenkins → In-process Script Approval 메뉴에서 아래 항목을 수동 승인
    • method org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper getRawBuild

    ✅ 2. Sandbox 해제

    Declarative Pipeline에서는 Sandbox 해제를 해도 일부 내부 접근이 차단될 수 있습니다.

    이 경우에는 Scripted Pipeline으로 전환하는 것이 확실한 해결책입니다.


    ✨ Scripted Pipeline 예제 (Sandbox 없이 getRawBuild() 사용)

    node {
        stage('Get Last Build Time') {
            def prevBuild = currentBuild.rawBuild.getPreviousBuild()
            if (prevBuild) {
                def formatted = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(prevBuild.getTime())
                echo "📅 이전 실행 시간: ${formatted}"
            }
        }
    }
    

    해당 Job에서 "Use Groovy Sandbox" 체크 해제 필요


    💡 결론: 언제 Scripted, 언제 Declarative?

    상황 추천 방식
    빠르게 구성하는 간단한 파이프라인 Declarative (pipeline {})
    Jenkins 내부 객체 직접 제어 Scripted (node {})
    복잡한 로직 (조건, 반복, 예외 처리 등) Scripted
    보안 유지 및 팀 협업 Declarative

    📌 마무리

    Jenkins Pipeline을 구성할 때 형식적인 안정성과 보안이 필요하면 Declarative,

    더 높은 유연성과 시스템 수준 접근이 필요하면 Scripted를 사용하는 것이 바람직합니다.

    당신의 프로젝트 목적에 따라 적절히 선택하세요!

    반응형
Designed by Tistory.