젠킨스 파이프라인 구문: 초보자를 위한 종합 가이드
젠킨스(Jenkins)는 지속적 통합 및 지속적 배포(CI/CD) 워크플로우에 널리 사용되는 강력한 오픈 소스 자동화 서버입니다. 젠킨스의 핵심은 복잡한 소프트웨어 배포 프로세스를 정의, 예약 및 자동화하는 파이프라인을 활용하는 것입니다. CI/CD 요구 사항에 맞게 젠킨스를 효과적으로 활용하려는 모든 사람에게 젠킨스 파이프라인 구문을 이해하는 것은 매우 중요합니다. 이 가이드는 초보자 친화적인 방식으로 젠킨스 파이프라인 구문을 소개하고, 필수 구성 요소, 일반적인 구조 및 견고하고 효율적인 파이프라인을 구축하는 데 도움이 되는 모범 사례를 다룹니다.
본 기사의 목표는 젠킨스 파이프라인 구문을 명확하게 설명하고 실용적인 예제를 제공하여 그 복잡성을 없애는 것입니다. 선언적(Declarative) 구문과 스크립트(Scripted) 구문이라는 두 가지 주요 구문을 살펴보고 첫 번째 파이프라인을 구축하는 과정을 안내해 드릴 것입니다. 이 가이드가 끝날 때쯤이면 젠킨스 내에서 CI/CD 프로세스를 생성하고 관리하기 위한 견고한 기반을 갖추게 될 것입니다.
젠킨스 파이프라인 이해하기
A Jenkins pipeline is a suite of plugins that supports implementing and integrating C/CD pipelines into Jenkins. (젠킨스 파이프라인은 CI/CD 파이프라인을 젠킨스에 구현하고 통합하는 것을 지원하는 플러그인 모음입니다.) 이는 빌드, 테스트 및 배포 프로세스를 코드로 정의할 수 있게 하여 버전 관리, 반복 가능성 및 투명성을 보장합니다. 파이프라인은 여러 단계, 조건부 논리 및 다양한 도구와의 통합을 포함하여 복잡할 수 있습니다. 이러한 파이프라인을 성공적으로 구현하기 위해서는 이를 정의하는 구문이 매우 중요합니다.
선언적 파이프라인 대 스크립트 파이프라인
젠킨스는 파이프라인 정의를 위해 두 가지 주요 구문을 제공합니다.
- 선언적 파이프라인(Declarative Pipeline): 추상화 수준이 더 높은 구조화되고 의견이 반영된(opinionated) 구문입니다. 특히 일반적인 CI/CD 사용 사례의 경우 더 간단하고 읽기 쉬우며 유지 관리가 용이한 구문을 제공합니다. 선언적 파이프라인은 일반적으로 초보자에게 권장됩니다.
- 스크립트 파이프라인(Scripted Pipeline): Groovy 스크립트를 사용하는 보다 유연하고 강력한 구문입니다. 더 큰 제어 권한을 제공하고 복잡한 논리를 허용하지만, Groovy나 젠킨스 파이프라인 스크립팅에 익숙하지 않은 사용자에게는 학습하고 유지 관리하기가 더 어려울 수 있습니다.
이 가이드는 사용 용이성과 초보자에게 적합하다는 점 때문에 주로 선언적 파이프라인 구문에 중점을 둘 것이며, 관련성이 있을 경우 스크립트 파이프라인 개념도 간략하게 다룰 것입니다.
선언적 파이프라인 구문 필수 요소
선언적 파이프라인은 Jenkinsfile(파이프라인을 정의하는 파일로, 일반적으로 소스 제어 저장소에 커밋됨) 내의 pipeline {} 블록 내에서 정의됩니다. 구조는 계층적이며 이해하기 쉽습니다.
pipeline 블록
모든 선언적 파이프라인은 pipeline {} 블록으로 시작합니다.
pipeline {
// 파이프라인 구성은 여기에 들어갑니다
}
agent 지시어
agent 지시어는 파이프라인 또는 특정 단계가 실행될 위치를 지정합니다. 이는 전체 파이프라인에 대해 전역적으로 정의되거나 단계별로 정의될 수 있습니다.
agent any: 사용 가능한 모든 젠킨스 에이전트에서 파이프라인을 실행할 수 있습니다.agent { label 'my-agent-label' }: 지정된 레이블을 가진 에이전트에서 파이프라인이 실행됩니다.agent none: 전역 에이전트가 할당되지 않으며, 에이전트는 단계별로 지정되어야 합니다.
예시:
pipeline {
agent any
stages {
// ... 단계가 여기에 들어갈 것입니다
}
}
stages 및 stage 블록
stages는 하나 이상의 stage 블록을 포함하는 컨테이너입니다. 각 stage는 '빌드(Build)', '테스트(Test)' 또는 '배포(Deploy)'와 같이 파이프라인의 뚜렷한 부분을 나타냅니다. stage에는 최소한 하나의 steps 블록이 포함되어야 합니다.
예시:
pipeline {
agent any
stages {
stage('Build') {
steps {
// 빌드 단계가 여기에 들어갑니다
}
}
stage('Test') {
steps {
// 테스트 단계가 여기에 들어갑니다
}
}
}
}
steps 블록
steps 블록에는 실행될 실제 명령이나 작업이 포함됩니다. 이것들은 스테이지 내의 개별 작업입니다.
예시 ('Build' 단계 내):
steps {
echo '애플리케이션 컴파일 중...'
sh 'mvn clean install'
}
여기서 echo는 메시지를 표시하고 sh는 셸 명령(예: Maven 빌드)을 실행합니다. 기타 일반적인 단계로는 Windows 배치 명령용 bat, SCM 작업을 위한 git, 플러그인별 단계가 있습니다.
post 작업
post 섹션을 사용하면 파이프라인(또는 단계)이 성공 여부와 관계없이 완료된 후 실행될 작업을 정의할 수 있습니다. 일반적인 조건에는 always, success, failure, changed, unstable이 포함됩니다.
예시:
pipeline {
agent any
stages {
stage('Build') {
steps {
echo '빌드 중...'
}
}
}
post {
always {
echo '파이프라인이 완료되었습니다.'
}
success {
echo '파이프라인 성공!'
}
failure {
echo '파이프라인 실패.'
}
}
}
일반적인 파이프라인 구조 및 지시어
기본 사항 외에도 파이프라인은 종종 더 고급 구성이 필요합니다.
환경 변수
environment 지시어는 파이프라인 또는 단계 내에서 사용할 수 있는 환경 변수를 설정합니다.
예시:
pipeline {
agent any
environment {
APP_NAME = 'my-awesome-app'
JAVA_HOME = '/usr/lib/jvm/java-11-openjdk-amd64'
}
stages {
stage('Build') {
steps {
echo "빌드 중인 ${env.APP_NAME}"
sh 'echo $JAVA_HOME'
}
}
}
}
환경 변수는 env. 접두사(예: env.APP_NAME)를 사용하여 액세스되는 방식을 확인하십시오.
options 지시어
options 지시어는 SCM 체크아웃 비활성화 또는 시간 초과 설정과 같이 다양한 파이프라인별 설정을 구성할 수 있게 합니다.
예시:
pipeline {
agent any
options {
timestamps()
timeout(time: 1, unit: 'HOURS')
disableConcurrentBuilds()
}
stages {
// ...
}
}
timestamps(): 콘솔 출력에 타임스탬프를 추가합니다.timeout(): 전체 파이프라인에 대한 시간 초과를 설정합니다.disableConcurrentBuilds(): 동일한 파이프라인의 여러 빌드가 동시에 실행되는 것을 방지합니다.
parameters 지시어
이 지시어를 사용하면 파이프라인 실행 시 사용자가 제공할 수 있는 매개변수를 정의하여 파이프라인의 유연성을 높일 수 있습니다.
예시:
pipeline {
agent any
parameters {
string(name: 'BRANCH_NAME', defaultValue: 'main', description: '빌드할 브랜치')
booleanParam(name: 'TEST_ENABLED', defaultValue: true, description: '테스트 활성화/비활성화')
}
stages {
stage('Checkout') {
steps {
echo "브랜치 체크아웃: ${params.BRANCH_NAME}"
// checkout scm
}
}
stage('Build') {
when {
expression { params.TEST_ENABLED == true }
}
steps {
echo '테스트 활성화 상태로 빌드 실행 중...'
// 빌드 단계
}
}
}
}
매개변수는 params 객체(예: params.BRANCH_NAME)를 통해 액세스됩니다.
when 지시어
when 지시어를 사용하면 다양한 기준에 따라 단계 또는 단계를 조건부로 실행할 수 있습니다.
예시 (브랜치 이름을 사용):
stage('Deploy to Staging') {
when {
branch 'develop'
}
steps {
echo '스테이징 환경으로 배포 중...'
// 배포 스크립트
}
}
기타 when 조건으로는 expression, changelog, equals, allOf, anyOf, noneOf가 있습니다.
스크립트 파이프라인 기본 사항 (간략히)
스크립트 파이프라인은 Groovy로 작성되며 보다 명령형 프로그래밍 스타일을 제공합니다. 선언적 파이프라인의 엄격한 구조는 없지만 최고의 유연성을 제공합니다.
예시:
node {
stage('Build') {
echo '빌드 중...'
sh 'mvn clean install'
}
stage('Test') {
echo '테스트 중...'
sh 'mvn test'
}
}
여기서 node는 agent와 유사하며 단계는 명령형으로 정의됩니다. 스크립트 파이프라인은 스크립트 블록 내에 pipeline {}을 포함하여 선언적 구문 기능을 통합하거나 그 반대로도 사용할 수 있습니다.
젠킨스 파이프라인 구문 모범 사례
- 단순성을 위해 선언적 사용: 대부분의 일반적인 CI/CD 워크플로우에는 가독성과 유지 관리 용이성 때문에 선언적 구문이 권장됩니다.
- 파이프라인을 코드로 유지:
Jenkinsfile을 애플리케이션 코드와 함께 소스 제어 저장소에 보관하십시오. - 공유 라이브러리 사용: 복잡하거나 반복적인 파이프라인 로직의 경우 재사용성 및 일관성을 높이기 위해 Jenkins 공유 라이브러리 사용을 고려하십시오.
- 단계를 모듈화: 파이프라인을 논리적이고 잘 정의된 단계로 나누십시오.
- 실패를 우아하게 처리: 파이프라인 실패 시에도 정리 또는 알림이 발생하도록
post작업을 활용하십시오. - 자격 증명 보안: 하드 코딩하는 대신 민감한 정보(암호, API 키)에 대해 젠킨스 자격 증명 관리를 사용하십시오.
- 적절하게 매개변수화: 빌드 구성, 배포 대상 또는 변경될 수 있는 기타 변수에 대해 매개변수를 사용하십시오.
- 모든 것을 버전 관리:
Jenkinsfile을 코드로 취급하고 버전 관리하십시오.
결론
젠킨스 파이프라인 구문, 특히 선언적 구문은 CI/CD 프로세스를 정의하고 자동화하는 강력하고 유연한 방법을 제공합니다. pipeline, agent, stages, steps, post 작업과 같은 핵심 구성 요소를 이해하면 효과적인 파이프라인 구축을 시작할 수 있습니다. 익숙해지면 environment, options, parameters, when과 같은 지시어를 탐색하여 보다 정교한 워크플로우를 만들 수 있습니다. 파이프라인이 견고하고 유지 관리 가능하며 안전한지 확인하려면 모범 사례를 따르는 것을 잊지 마십시오.
즐거운 파이프라인 작업 되세요!