🔧
CI/CD 자동화 서버 가이드

Jenkins 완전 가이드

👥 방문자 수

가장 널리 쓰이는 오픈소스 CI/CD 서버, Jenkins. 설치부터 Jenkinsfile 파이프라인, Credentials 관리, Multibranch, 분산 빌드, Docker/Kubernetes 배포까지 실무 예제로 학습합니다.

Jenkinsfile Pipeline Multibranch 분산 빌드

1. Jenkins란?

Jenkins는 빌드, 테스트, 배포를 자동화하는 오픈소스 CI/CD 서버입니다. 2011년 Hudson에서 포크되어 현재까지 가장 널리 쓰이는 자동화 서버로, 방대한 플러그인 생태계가 강점입니다.

구성 요소역할
Controller (Master)UI, 스케줄링, Job 정의 관리. 실제 빌드는 최소화 권장
Agent (Node)실제 빌드/테스트를 실행하는 워커. Controller와 분리 배포 가능
Job / Pipeline실행할 작업 단위. Freestyle 또는 코드 기반 Pipeline
PluginGit, Docker, Kubernetes, Slack 등 거의 모든 도구와 연동
ExecutorAgent 내에서 동시에 실행 가능한 빌드 슬롯 수

2. 설치 (Docker)

services:
  jenkins:
    image: jenkins/jenkins:lts-jdk17
    ports:
      - "8080:8080"   # 웹 UI
      - "50000:50000" # Agent(JNLP) 연결 포트
    volumes:
      - jenkins-data:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock  # 컨테이너 안에서 docker 명령 사용 시

volumes:
  jenkins-data:yaml
docker compose up -d

# 초기 관리자 비밀번호 확인
docker compose exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
# http://localhost:8080 접속 → 비밀번호 입력 → "Install suggested plugins"bash

3. Freestyle Job vs Pipeline

방식특징
Freestyle JobUI에서 클릭으로 단계 구성. 간단하지만 버전 관리·재사용 어려움
Pipeline (Jenkinsfile)Groovy DSL 코드로 파이프라인 정의. Git으로 버전 관리 (권장)
Declarative Pipeline정형화된 문법. 가독성이 높고 대부분의 팀에 권장
Scripted Pipeline순수 Groovy. 유연하지만 복잡한 로직에만 사용 권장
💡
신규 프로젝트는 저장소 루트에 Jenkinsfile을 두는 Pipeline as Code 방식을 사용하세요. 파이프라인 정의 자체가 Git 히스토리로 관리되어 리뷰·롤백이 가능합니다.

4. Jenkinsfile 기초

// Jenkinsfile — Declarative Pipeline
pipeline {
  agent any

  environment {
    NODE_ENV = 'production'
  }

  stages {
    stage('Checkout') {
      steps { checkout scm }
    }
    stage('Install') {
      steps { sh 'npm ci' }
    }
    stage('Test') {
      steps { sh 'npm test -- --ci' }
      post {
        always { junit 'reports/junit.xml' }
      }
    }
    stage('Build') {
      steps { sh 'npm run build' }
    }
    stage('Deploy') {
      when { branch 'main' }
      steps { sh './deploy.sh production' }
    }
  }

  post {
    success { echo '✅ 파이프라인 성공' }
    failure { slackSend channel: '#ci', message: "❌ 빌드 실패: ${env.BUILD_URL}" }
  }
}groovy

5. Credentials & 파라미터

// Manage Jenkins → Credentials 에 등록된 값을 파이프라인에서 사용
pipeline {
  agent any
  environment {
    DOCKERHUB = credentials('dockerhub-creds')  // username/password 쌍
    API_KEY   = credentials('api-key-secret')   // secret text
  }
  parameters {
    choice(name: 'ENV', choices: ['staging', 'production'], description: '배포 환경')
    booleanParam(name: 'SKIP_TESTS', defaultValue: false, description: '테스트 스킵 여부')
  }
  stages {
    stage('Login') {
      steps {
        sh 'echo $DOCKERHUB_PSW | docker login -u $DOCKERHUB_USR --password-stdin'
      }
    }
    stage('Test') {
      when { expression { !params.SKIP_TESTS } }
      steps { sh 'npm test' }
    }
    stage('Deploy') {
      steps { sh "./deploy.sh ${params.ENV}" }
    }
  }
}groovy

6. Multibranch Pipeline & Webhook

Multibranch Pipeline은 저장소의 모든 브랜치/PR을 자동으로 스캔해 각각의 Jenkinsfile로 개별 파이프라인을 생성합니다.

// New Item → Multibranch Pipeline
Branch Sources: GitHub
Repository: https://github.com/org/repo
Discover branches: All branches
Discover pull requests: Merging the pull request with the current target branch
Scan repository triggers: Periodically (또는 Webhook)

# GitHub → Settings → Webhooks
Payload URL: http://jenkins.example.com/github-webhook/
Content type: application/json
Events: Push, Pull requestbash
🔔
Webhook을 쓰면 Push/PR 이벤트 즉시 빌드가 트리거되어 폴링(Poll SCM)보다 지연이 없고 GitHub API 호출량도 줄어듭니다.

7. Agent & 분산 빌드

Controller에 직접 빌드를 실행하면 부하와 보안 위험이 커집니다. 실제 빌드는 별도 Agent에서 실행하는 것이 표준입니다.

// Jenkinsfile에서 특정 라벨의 Agent 지정
pipeline {
  agent { label 'linux && docker' }
  stages {
    stage('Build') {
      steps { sh 'make build' }
    }
  }
}

// Kubernetes 기반 동적 Agent (Kubernetes 플러그인)
pipeline {
  agent {
    kubernetes {
      yaml '''
        apiVersion: v1
        kind: Pod
        spec:
          containers:
          - name: node
            image: node:20
            command: ["cat"]
            tty: true
      '''
    }
  }
  stages {
    stage('Build') {
      steps { container('node') { sh 'npm ci && npm run build' } }
    }
  }
}groovy

8. Docker/Kubernetes 배포 연동

// 이미지 빌드 & 레지스트리 푸시 & K8s 롤아웃
pipeline {
  agent any
  environment {
    IMAGE = "registry.example.com/myapp:${env.BUILD_NUMBER}"
    KUBECONFIG = credentials('kubeconfig-prod')
  }
  stages {
    stage('Docker Build') {
      steps { sh 'docker build -t $IMAGE .' }
    }
    stage('Push') {
      steps {
        sh 'echo $DOCKERHUB_PSW | docker login -u $DOCKERHUB_USR --password-stdin'
        sh 'docker push $IMAGE'
      }
    }
    stage('Deploy to K8s') {
      steps {
        sh 'kubectl set image deployment/myapp app=$IMAGE --kubeconfig=$KUBECONFIG'
        sh 'kubectl rollout status deployment/myapp --kubeconfig=$KUBECONFIG'
      }
    }
  }
}groovy

Kubernetes 리소스와 롤링 업데이트 개념은 Kubernetes 기초 가이드를 참고하세요.

9. 다음 단계

🚀
Jenkins 심화 로드맵

Shared Library: 여러 저장소에서 재사용할 공통 파이프라인 코드 관리
Blue Ocean: 파이프라인 시각화 UI 플러그인
Jenkins Configuration as Code (JCasC): Jenkins 자체 설정을 YAML로 관리
GitOps 전환: ArgoCD/Flux로 배포 단계를 Git 선언적 방식으로 이관

연계 가이드: CI/CD 개념 가이드 · Docker 가이드 · Kubernetes 가이드