1. Jenkins란?
Jenkins는 빌드, 테스트, 배포를 자동화하는 오픈소스 CI/CD 서버입니다. 2011년 Hudson에서 포크되어 현재까지 가장 널리 쓰이는 자동화 서버로, 방대한 플러그인 생태계가 강점입니다.
| 구성 요소 | 역할 |
|---|---|
| Controller (Master) | UI, 스케줄링, Job 정의 관리. 실제 빌드는 최소화 권장 |
| Agent (Node) | 실제 빌드/테스트를 실행하는 워커. Controller와 분리 배포 가능 |
| Job / Pipeline | 실행할 작업 단위. Freestyle 또는 코드 기반 Pipeline |
| Plugin | Git, Docker, Kubernetes, Slack 등 거의 모든 도구와 연동 |
| Executor | Agent 내에서 동시에 실행 가능한 빌드 슬롯 수 |
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 Job | UI에서 클릭으로 단계 구성. 간단하지만 버전 관리·재사용 어려움 |
| 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 가이드
• Shared Library: 여러 저장소에서 재사용할 공통 파이프라인 코드 관리
• Blue Ocean: 파이프라인 시각화 UI 플러그인
• Jenkins Configuration as Code (JCasC): Jenkins 자체 설정을 YAML로 관리
• GitOps 전환: ArgoCD/Flux로 배포 단계를 Git 선언적 방식으로 이관
연계 가이드: CI/CD 개념 가이드 · Docker 가이드 · Kubernetes 가이드