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}"
}