Jenkins
Jenkins CI
오픈소스 CI/CD 자동화 서버. 파이프라인으로 빌드, 테스트, 배포 자동화. 플러그인 생태계.
Jenkins CI
오픈소스 CI/CD 자동화 서버. 파이프라인으로 빌드, 테스트, 배포 자동화. 플러그인 생태계.
Jenkins는 2004년 Sun Microsystems에서 시작된 세계에서 가장 널리 사용되는 오픈소스 CI/CD 자동화 서버입니다. 1,800개 이상의 플러그인 생태계를 통해 거의 모든 개발 도구와 통합할 수 있으며, Java로 작성되어 크로스 플랫폼에서 동작합니다.
Jenkins의 핵심은 파이프라인입니다. Jenkinsfile이라는 Groovy DSL로 빌드, 테스트, 배포 단계를 코드로 정의합니다. Declarative Pipeline은 가독성이 좋고 초보자 친화적이며, Scripted Pipeline은 복잡한 로직을 유연하게 구현할 수 있습니다. 파이프라인 코드는 소스 저장소에 함께 관리되어 버전 관리가 가능합니다.
확장성 측면에서 Jenkins는 Master-Agent 아키텍처를 지원합니다. Master는 파이프라인 실행을 오케스트레이션하고, Agent(워커)에서 실제 빌드를 수행합니다. Kubernetes 환경에서는 Pod Agent로 동적으로 빌드 환경을 프로비저닝할 수 있어 리소스 효율성이 높습니다.
최근에는 GitHub Actions, GitLab CI, CircleCI 같은 SaaS 솔루션이 떠오르고 있지만, 온프레미스 환경이나 복잡한 레거시 빌드가 있는 기업에서는 여전히 Jenkins가 표준입니다. 관리 오버헤드는 높지만 커스터마이징의 자유도는 타의 추종을 불허합니다.
// Jenkinsfile - Declarative Pipeline 예제
pipeline {
agent {
kubernetes {
yaml '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: maven
image: maven:3.9-eclipse-temurin-17
command: ['sleep', 'infinity']
- name: docker
image: docker:24-dind
securityContext:
privileged: true
'''
}
}
environment {
DOCKER_REGISTRY = 'registry.company.com'
IMAGE_NAME = 'api-server'
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Build & Test') {
steps {
container('maven') {
sh 'mvn clean verify -Dmaven.test.failure.ignore=false'
}
}
post {
always {
junit '**/target/surefire-reports/*.xml'
jacoco execPattern: '**/target/*.exec'
}
}
}
stage('Build Image') {
when {
branch 'main'
}
steps {
container('docker') {
sh """
docker build -t ${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER} .
docker push ${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER}
"""
}
}
}
stage('Deploy to Staging') {
when {
branch 'main'
}
steps {
sh "kubectl set image deployment/api-server api=${DOCKER_REGISTRY}/${IMAGE_NAME}:${BUILD_NUMBER} -n staging"
}
}
}
post {
failure {
slackSend channel: '#build-alerts', color: 'danger',
message: "Build Failed: ${env.JOB_NAME} #${env.BUILD_NUMBER}"
}
}
}
데브옵스: "Jenkins 마스터 업그레이드 해야 하는데, 플러그인 호환성 때문에 미루고 있어요. 언제 점검 시간 잡을까요?"
개발자: "그 전에 Jenkinsfile 문법이 deprecated 되는 부분 먼저 수정해야 할 것 같아요. `node` 블록 대신 `agent` 쓰는 식으로요."
데브옵스: "좋아요. 테스트 Jenkins 인스턴스에서 먼저 검증하고 롤백 플랜 세워서 진행하죠."
면접관: "Jenkins에서 빌드 시간을 단축하기 위해 어떤 방법을 쓰셨나요?"
지원자: "parallel 스테이지로 독립적인 테스트를 동시에 돌리고, 캐시를 활용해서 의존성 다운로드 시간을 줄였습니다. 또 Kubernetes Pod Agent를 써서 빌드 환경을 빠르게 프로비저닝했습니다."
리뷰어: "Jenkinsfile에서 credentials를 하드코딩하면 안 됩니다. withCredentials 블록으로 바꾸세요."
개발자: "네, Jenkins Credentials Store에 등록하고 credentials() 함수로 참조하도록 수정하겠습니다."