젠킨스파일

젠킨스파일 (Jenkinsfile) 사용법

파이프라인을 코드로 관리한다는 것의 실체가 바로 **젠킨스파일(Jenkinsfile)**이에요. 프로젝트 루트에 두는 이 텍스트 파일 하나가 CI/CD 흐름 전체를 담고, 소스 저장소에 커밋되면 그 자체가 버전 관리돼요. 작성 문법은 선언적(Declarative)과 스크립트(Scripted) 두 가지를 지원하고, 둘 다 지속적 전달 파이프라인을 만드는 데 쓸 수 있어요. 여기서는 젠킨스파일을 어떻게 만들고, 빌드·테스트·배포 단계를 어떻게 채우는지 살펴볼게요.

출처: Using a Jenkinsfile - Jenkins Handbook

젠킨스파일 만들기

텍스트 에디터(Groovy 문법 하이라이팅을 지원하면 더 좋아요)로 프로젝트 루트에 Jenkinsfile을 새로 만들어요. 스크립트 파이프라인으로 시작한다면 node 블록으로 감싸고, 그 안에서 checkout scm으로 트리거된 리비전을 체크아웃해요. 여기서 scm은 이 파이프라인 실행을 트리거한 특정 리비전을 클론하라고 checkout에게 알려주는 특별한 변수예요.

node {
    checkout scm
    /* ... 중략 ... */
}

Build 단계 — 산출물 만들기

선언적 파이프라인에서 빌드 단계는 이렇게 표현해요. sh 스텝으로 빌드 명령을 실행하고, archiveArtifacts로 산출물을 보관해요.

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                sh 'make'
                archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
            }
        }
    }
}

fingerprint: true는 산출물에 지문(fingerprint)을 기록해 어느 빌드에서 만들어진 것인지 추적할 수 있게 해줘요.

Test 단계 — 테스트 결과 기록하기

자동화된 테스트를 실행하는 건 성공적인 지속적 전달에서 핵심이에요. 테스트가 실패했을 때 젠킨스가 그 실패를 기록해 웹 UI에 보여주는 게 중요해요. JUnit 플러그인이 제공하는 junit 스텝이 테스트 리포트를 모아 시각화해줘요.

stage('Test') {
    steps {
        junit 'reports/**/*.xml'
    }
}

이렇게 리포트 경로만 알려주면 젠킨스가 XML 형식의 테스트 결과를 파싱해 추세·실패 내역을 보여줘요.

Deploy 단계 — 조건과 예외 처리

스크립트 파이프라인은 조건 테스트, 반복문, try/catch/finally 블록, 심지어 함수 정의까지 포함할 수 있어요. 아래처럼 조건에 따라 배포 여부를 가르는 흐름을 만들 수 있어요.

node {
    stage('Deploy') {
        if (currentBuild.currentResult == 'SUCCESS') {
            sh 'deploy-to-production.sh'
        } else {
            echo '빌드가 실패해 배포를 건너뜁니다.'
        }
    }
}

환경변수 다루기

젠킨스 파이프라인은 전역 변수 env로 환경변수를 노출해요. envJenkinsfile 어디에서든 접근할 수 있고, 전체 목록은 ${YOUR_JENKINS_URL}/pipeline-syntax/globals에서 확인할 수 있어요. Groovy의 Map처럼 키로 접근하면 되죠.

sh "DEPLOY_TARGET = ${env.DEPLOY_TARGET}"

환경변수를 설정하는 방식은 문법에 따라 달라요. 선언적 파이프라인은 environment 지시어를 쓰고, 스크립트 파이프라인은 withEnv 스텝을 사용해요.

pipeline {
    agent any
    environment {
        CC = 'clang'
    }
    stages {
        stage('Example') {
            environment {
                DEBUG_FLAGS = '-g'
            }
            steps {
                sh 'printenv'
            }
        }
    }
}

블록 최상위 environment는 파이프라인 전체 스텝에 적용되고, stage 안에 두면 그 단계 스텝에만 적용돼요.

크레덴셜 다루기

비밀번호·토큰 같은 자격 증명은 파이프라인에 하드코딩하지 말고 크레덴셜로 관리해야 해요. 시크릿 텍스트·사용자명/비밀번호·시크릿 파일은 선언적 파이프라인의 credentials() 헬퍼(주로 environment 지시어 안에서 사용)로 넣을 수 있어요.

예를 들어 시크릿 파일 크레덴셜을 쓰면, 인증서 파일 위치와 비밀번호를 각각 환경변수로 참조할 수 있어요. 사용자명/비밀번호 크레덴셜은 자동 생성된 환경변수(..._USR, ..._PSW)로 나뉘어 들어와요.

stage('Example') {
    environment {
        BITBUCKET_COMMON_CREDS = credentials('bitbucket-common')
    }
    steps {
        sh 'echo $BITBUCKET_COMMON_CREDS_USR $BITBUCKET_COMMON_CREDS_PSW'
    }
}

고급 스크립트 파이프라인 — 병렬 실행

스크립트 파이프라인은 Groovy 기반이라 대부분의 Groovy 문법을 그대로 쓸 수 있어요. 대표적인 활용이 병렬(parallel) 실행이에요. 여러 작업을 동시에 돌려 전체 파이프라인 시간을 줄이는 거죠. 선언적 파이프라인에서도 parallel을 지원하지만, 스크립트 파이프라인에서는 완전한 Groovy 로직과 결합해 더 유연하게 구성할 수 있어요.

더 알아보기