Jenkins Pipeline 핵심 구문 완벽 정리

1. Agent(실행 환경) 설정

Pipeline이 실행될 환경을 지정합니다. agent는 선언적 파이프라인에서, node는 스크립트 파이프라인에서 사용됩니다.

옵션설명
any가용한 임의의 노드에서 실행
none명시적 지정 없음 (stage별로 개별 지정 필요)
label특정 라벨을 가진 노드에서 실행
// 동일한 표현
agent { node { label 'linux-worker' }}
agent { label 'linux-worker' }

2. Stage(단계) 구성

파이프라인을 논리적 단위로 분할합니다. 소스 가져오기, 컴파일, 테스트, 배포 등의 단계로 구성합니다.

// 선언적 파이프라인
pipeline {
    agent any
    stages {
        stage('Checkout') {
            // 작업 단계
        }
        stage('Compile') {
            // 작업 단계
        }
    }
}

// 스크립트 파이프라인
node('worker') {
    stage('Checkout') {
        // 작업 단계
    }
    stage('Compile') {
        // 작업 단계
    }
}

3. Step(실행 단위)

각 stage 내부에서 실제로 수행되는 명령입니다. 선언적 파이프라인에서는 steps 블록 내부에, 스크립트 파이프라인에서는 직접 작성합니다.

// 선언적 파이프라인
pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                sh "pwd"  //  명령 실행
            }
        }
    }
}

// 스크립트 파이프라인 - 조건문 활용
node('worker') {
    stage('Checkout') {
        if ("${vcsType}" == "Git") {
            // Git 저장소 클론
        } else if ("${vcsType}" == "SVN") {
            // SVN 체크아웃
        } else {
            error "지원하지 않는 버전관리 시스템: ${vcsType}"
        }
    }
}

4. Post 블록

파이프라인 또는 stage의 완료 상태에 따라 후속 작업을 정의합니다.

조건동작 시점
always결과와 무관하게 항상 실행
changed이전 실행과 상태가 달라진 경우
failure실패 시
success성공 시
unstable불안정 상태(테스트 실패 등)
aborted중단된 경우
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'Building...'
            }
        }
    }
    post {
        always {
            echo '정리 작업 수행'
        }
        failure {
            echo '빌드 실패 알림 발송'
        }
    }
}

5. 핵심 디렉티브

5.1 environment - 환경변수

전역 또는 stage 수준의 환경변수를 정의합니다. credentials() 헬퍼를 통해 Jenkins에 등록된 인증정보를 안전하게 사용할 수 있습니다.

pipeline {
    agent any
    environment {
        DEPLOY_TARGET = 'production'
    }
    stages {
        stage('Deploy') {
            environment {
                API_KEY = credentials('prod-api-key')
            }
            steps {
                sh 'echo $DEPLOY_TARGET'
                sh 'echo $API_KEY'
            }
        }
    }
}

5.2 options - 실행 옵션

옵션설명
buildDiscarder빌드 기록 보관 정책
disableConcurrentBuilds동시 실행 방지
skipDefaultCheckout자동 소스체크아웃 생략
timeout실행 시간 제한
retry실패 시 재시도 횟수
timestamps콘솔에 타임스탬프 추가
pipeline {
    agent any
    options {
        timeout(time: 30, unit: 'MINUTES')
        disableConcurrentBuilds()
        timestamps()
    }
    stages {
        stage('Example') {
            steps {
                echo 'Processing...'
            }
        }
    }
}

5.3 parameters - 빌드 파라미터

타입용도
string문자열 입력
text여러 줄 텍스트
booleanParam참/거짓 선택
choice드롭다운 선택
password비밀번호 입력(마스킹)
pipeline {
    agent any
    parameters {
        string(name: 'USER_NAME', defaultValue: 'Developer', description: '실행자 이름')
        choice(name: 'ENV', choices: ['dev', 'staging', 'prod'], description: '포 환경')
        booleanParam(name: 'SKIP_TESTS', defaultValue: false, description: '테스트 생략')
    }
    stages {
        stage('Run') {
            steps {
                echo "환경: ${params.ENV}"
                echo "사용자: ${params.USER_NAME}"
            }
        }
    }
}

5.4 triggers - 자동 실행

트리거설명
cron정기적 스케줄 실행
pollSCM소스 변경 감지 시 실행
upstream다른 잡 완료 시 실행
pipeline {
    agent any
    triggers {
        cron('H 2 * * 1-5')  // 평일 새벽 2시
        pollSCM('H/15 * * * *')  // 15분 간격 변경 확인
    }
    stages {
        stage('Scheduled') {
            steps {
                echo '자동 실행됨'
            }
        }
    }
}

5.5 tools - 도구 설정

Jenkins 전역 도구 설정에 등록된 도구를 자동으로 설치하고 환경변수를 설정합니다.

pipeline {
    agent any
    tools {
        maven 'M3'
        jdk 'OpenJDK17'
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -v'
                sh 'java -version'
            }
        }
    }
}

5.6 input - 수동 승인

실행 중 사용자의 확인을 요청합니다.

pipeline {
    agent any
    stages {
        stage('Production Deploy') {
            input {
                message "프로덕션에 배포하시겠습니까?"
                ok "배포 승인"
                submitter "lead-dev,ops-manager"
                parameters {
                    string(name: 'VERSION', defaultValue: '1.0.0', description: '배포 버전')
                }
            }
            steps {
                echo "배포 버전: ${VERSION}"
            }
        }
    }
}

5.7 when - 조건부 실행

복합 조건을 조합하여 세밀한 실행 제어가 가능합니다.

pipeline {
    agent any
    stages {
        stage('Develop Build') {
            steps {
                echo '개발 빌드'
            }
        }
        stage('Production Deploy') {
            when {
                allOf {
                    branch 'main'
                    environment name: 'DEPLOY_ENV', value: 'production'
                }
            }
            steps {
                echo '프로덕션 배포'
            }
        }
        stage('Staging Deploy') {
            when {
                anyOf {
                    branch 'develop'
                    branch 'release/*'
                }
            }
            steps {
                echo '스테이징 배포'
            }
        }
    }
}

beforeAgent true 옵션을 사용하면 agent 할당 전에 조건을 먼저 평가하여 불필요한 리소스 할당을 방지합니다.

stage('Conditional') {
    agent { label 'expensive-gpu' }
    when {
        beforeAgent true
        expression { params.RUN_GPU_TESTS == true }
    }
    steps {
        echo 'GPU 노드에서 실행'
    }
}

5.8 parallel - 병렬 실행

독립적인 작업을 동시에 수행하여 전체 실행 시간을 단축합니다.

pipeline {
    agent any
    stages {
        stage('Setup') {
            steps {
                echo '초기화'
            }
        }
        stage('Tests') {
            failFast true  // 하나라도 실패하면 전체 중단
            parallel {
                stage('Unit Tests') {
                    agent { label 'test-runner-1' }
                    steps {
                        echo '단위 테스트 실행'
                    }
                }
                stage('Integration Tests') {
                    agent { label 'test-runner-2' }
                    steps {
                        echo '통합 테스트 실행'
                    }
                }
                stage('Security Scan') {
                    steps {
                        echo '보안 검사'
                    }
                }
            }
        }
    }
}

5.9 script - 스크립트 블록

선언적 파이프라인 내에서 Groovy 스크립트를 실행합니다. 복잡한 로직은 공유 라이브러리로 분리하는 것을 권장합니다.

pipeline {
    agent any
    stages {
        stage('Dynamic') {
            steps {
                echo '시작'
                script {
                    def targets = ['web', 'api', 'worker']
                    targets.each { svc ->
                        echo "Deploying ${svc} service"
                    }
                    
                    def version = calculateVersion()
                    echo "Version: ${version}"
                }
            }
        }
    }
}

def calculateVersion() {
    return "2.${BUILD_NUMBER}.${currentBuild.startTimeInMillis % 1000}"
}

태그: Jenkins Pipeline Groovy CI/CD DevOps

8월 6일 16:22에 게시됨