젠킨스 파이프라인

젠킨스 파이프라인 (Pipeline): 배포 자동화를 코드로

젠킨스에서 배포 자동화를 '설정 화면에 값 채우기'가 아니라 코드로 관리하고 싶다면, 파이프라인(Pipeline)이 바로 그 주인공이에요. 파이프라인은 지속적 전달(CD) 파이프라인을 젠킨스에 구현하고 통합하도록 돕는 일련의 플러그인 묶음이죠. 단순한 빌드부터 복잡한 배포 흐름까지, 파이프라인 전용 DSL(Domain-Specific Language) 문법으로 "코드로서의 파이프라인(Pipeline as Code)"을 구현합니다. 젠킨스파일 하나만 버전 관리에 올려두면 파이프라인 전체를 언제든 재현할 수 있어요.

출처: Pipeline - Jenkins Handbook

파이프라인이 해결하는 문제

전통적인 프리스타일(Freestyle) 잡은 빌드 단계를 웹 화면에서 일일이 설정해야 해서, 그 설정이 '버전 관리 대상'이 되지 못해요. 파이프라인은 이 문제를 코드로 풀어요. 배포 흐름 단계가 Jenkinsfile에 담기고, 그 파일이 소스 저장소에 커밋되면 누가·언제·어떤 내용으로 파이프라인을 만들었는지 이력이 그대로 남죠. 그래서 팀 단위로 파이프라인을 리뷰하고, 브랜치마다 다른 흐름을 만들고, 재현 불가능한 '그때는 됐는데' 문제에서 벗어날 수 있어요.

선언적 vs 스크립트 파이프라인 문법

Jenkinsfile은 크게 두 가지 문법으로 쓸 수 있어요 — **선언적(Declarative)**과 스크립트(Scripted). 둘은 구성 방식이 근본적으로 달라요.

선언적 파이프라인은 코드를 쓰고 읽기 쉽도록 설계된 문법이에요. 구조가 정해져 있고, 스크립트 파이프라인보다 풍부한 문법 요소를 제공하죠. 반대로 스크립트 파이프라인은 Groovy 기반의 범용 DSL이라 훨씬 유연해요. 조건문·반복문 같은 실제 프로그래밍 로직을 자유롭게 넣을 수 있어요. 다만 유연한 만큼 작성자가 감당할 책임도 커져요.

선언적 파이프라인의 골격

선언적 파이프라인에서 pipeline 블록이 파이프라인 전체가 하는 일을 정의해요. 여기서 쓰는 stagesteps는 아래에 나올 스크립트 파이프라인과 공통 요소예요.

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                // 빌드 단계에서 실행할 작업
            }
        }
        stage('Test') {
            steps {
                // 테스트 단계에서 실행할 작업
            }
        }
        stage('Deploy') {
            steps {
                // 배포 단계에서 실행할 작업
            }
        }
    }
}

agent any는 파이프라인(또는 각 단계)을 사용 가능한 아무 에이전트에서 실행하라는 뜻이에요. stage('Build')처럼 단계를 나누고, 그 안의 steps에 실제 작업을 채워 넣는 구조죠.

스크립트 파이프라인의 골격

스크립트 파이프라인에서는 핵심 작업을 node 블록으로 감싸요. node 블록은 두 가지를 보장해요 — 작업이 실행될 에이전트와 워크스페이스를 할당하는 것, 그리고 그 안에서 pipeline의 동작을 제어하는 것. 스크립트 파이프라인에서 stage 블록은 선택적이에요.

node {
    stage('Build') {
        // 빌드 단계에서 실행할 작업
    }
    stage('Test') {
        // 테스트 단계에서 실행할 작업
    }
    stage('Deploy') {
        // 배포 단계에서 실행할 작업
    }
}

파이프라인 예시로 흐름 보기

실제 예시를 하나 보면 각 요소가 어떻게 연결되는지 명확해져요.

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                sh 'make'                                      // 셸 명령 실행
                archiveArtifacts artifacts: '**/target/*.jar', // 산출물 보관
                    fingerprint: true
            }
        }
        stage('Test') {
            steps {
                junit 'reports/**/*.xml'                       // 테스트 리포트 수집
            }
        }
    }
}

여기서 pipeline은 선언적 파이프라인 고유 문법이고, agent는 노드에 실행자(executor)와 워크스페이스를 할당하라고 알려줘요. stage는 단계를 나타내고, steps는 그 단계에서 실행할 동작을 담죠. sh는 셸 명령을 실행하는 스텝(Pipeline: Nodes and Processes 플러그인 제공), junit은 테스트 리포트를 모아주는 스텝(JUnit 플러그인 제공)이에요. 이렇게 파이프라인은 여러 플러그인이 제공하는 스텝을 조립해 하나의 배포 흐름을 만드는 방식이에요.

더 알아보기