Spring Boot와 Jenkins CI/CD 파이프라인 구축 - 자동화된 배포 환경 만들기

개발 규모가 커질수록 “코드를 수정할 때마다 수동으로 빌드하고 배포”하는 방식은 비효율적입니다. 이를 자동화하기 위한 대표적인 도구가 Jenkins이며, Spring Boot와 결합하면 빌드·테스트·배포가 자동으로 이어지는 CI/CD 파이프라인을 쉽게 구성할 수 있습니다. 

 

CI/CD란 무엇인가?

  • CI (Continuous Integration): 개발자가 코드를 푸시할 때마다 자동으로 빌드와 테스트를 수행하여 문제를 조기에 발견
  • CD (Continuous Deployment): 빌드가 성공하면 자동으로 스테이징 또는 프로덕션 서버에 배포

즉, Jenkins를 이용하면 “코드 → 테스트 → 빌드 → 배포”의 전체 과정을 자동화할 수 있습니다.

 

1. Jenkins 환경 준비

1-1. Docker로 Jenkins 설치

Jenkins를 가장 간단히 설치하는 방법은 Docker를 이용하는 것입니다.

docker run -d \
  -p 8080:8080 -p 50000:50000 \
  --name jenkins \
  -v jenkins_home:/var/jenkins_home \
  jenkins/jenkins:lts

설치 후 브라우저에서 http://localhost:8080으로 접속하면 Jenkins 초기 설정 화면이 나타납니다. 처음 로그인 시 표시되는 /var/jenkins_home/secrets/initialAdminPassword 파일의 비밀번호를 입력하면 됩니다.

 

1-2. 필수 플러그인 설치

Jenkins 초기 설정 시 다음 플러그인을 설치합니다.

  • Git Plugin
  • Pipeline Plugin
  • Docker Pipeline
  • Blue Ocean (파이프라인 시각화)
  • Credentials Binding Plugin

 

2. Spring Boot 프로젝트 준비

Spring Boot 프로젝트의 루트 디렉터리에 Jenkinsfile을 추가합니다. 이 파일은 파이프라인의 전체 자동화 과정을 정의합니다.

pipeline {
    agent any

    environment {
        DOCKER_IMAGE = 'your-dockerhub-id/springboot-ci-demo'
        REGISTRY_CREDENTIALS = 'dockerhub-cred'
    }

    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/yourname/springboot-ci-demo.git'
            }
        }

        stage('Build') {
            steps {
                sh './gradlew clean build'
            }
        }

        stage('Docker Build & Push') {
            steps {
                script {
                    docker.withRegistry('https://index.docker.io/v1/', REGISTRY_CREDENTIALS) {
                        def app = docker.build("${DOCKER_IMAGE}:${env.BUILD_NUMBER}")
                        app.push()
                        app.push('latest')
                    }
                }
            }
        }

        stage('Deploy') {
            steps {
                sh 'docker stop springboot-demo || true && docker rm springboot-demo || true'
                sh 'docker run -d -p 8080:8080 --name springboot-demo your-dockerhub-id/springboot-ci-demo:latest'
            }
        }
    }

    post {
        success {
            echo '✅ 배포 성공!'
        }
        failure {
            echo '❌ 빌드 또는 배포 실패'
        }
    }
}

이 Jenkinsfile은 다음 순서로 동작합니다:

  • Git에서 최신 코드 가져오기
  • Gradle 빌드 수행
  • Docker 이미지 빌드 및 Docker Hub 푸시
  • 기존 컨테이너 중지 후 최신 버전 실행

 

3. Jenkins Credentials 설정

Jenkins 대시보드 → Manage Jenkins → Credentials → System → Global credentials에서 Docker Hub 계정을 등록합니다.

  • ID: dockerhub-cred
  • Username/Password: Docker Hub 계정 정보

이 ID는 Jenkinsfile의 REGISTRY_CREDENTIALS 환경 변수와 연결됩니다.

 

4. Jenkins 파이프라인 구성

4-1. 새로운 파이프라인 생성

Jenkins 홈 → 새로운 Item → Pipeline을 선택합니다.

  • 이름: SpringBoot-CI-Pipeline
  • 빌드 트리거: “GitHub hook trigger for GITScm polling” (푸시 시 자동 실행)
  • Pipeline Script: “Pipeline script from SCM” 선택 후 Git URL 입력

 

4-2. 자동 빌드 트리거

GitHub 저장소 설정에서 Jenkins 서버 URL을 웹훅으로 등록합니다.

http://your-jenkins-server:8080/github-webhook/

이제 코드를 푸시할 때마다 Jenkins가 자동으로 빌드와 배포를 수행합니다.

 

5. Blue Ocean으로 시각적 파이프라인 확인

Blue Ocean 플러그인을 사용하면 파이프라인의 각 단계를 시각적으로 확인할 수 있습니다.

http://localhost:8080/blue

각 단계의 상태(성공/실패)를 직관적으로 볼 수 있으며, 실패 시 해당 단계의 로그를 바로 분석할 수 있습니다.

 

6. 실무 적용 시 구성 팁

  • 멀티 브랜치 파이프라인: 브랜치별로 독립된 빌드 파이프라인 구성
  • 스테이징 환경 분리: main 푸시 시 프로덕션, develop 푸시 시 스테이징 배포
  • 테스트 단계 추가: JUnit, Mockito 등 단위 테스트 단계 삽입
  • Slack Notification: 빌드 성공/실패 알림을 Slack으로 전송
  • 보안: Jenkinsfile 내 비밀번호 직접 기입 금지 → Credentials 사용

 

7. CI/CD 파이프라인 전체 흐름 요약

[Git Push] → [Jenkins Trigger] → [Build & Test] → [Docker Build & Push] → [Deploy to Server]

이 과정은 모든 단계가 자동으로 실행되며, 개발자는 코드 작성에만 집중할 수 있습니다. 문제가 발생하면 Jenkins가 자동으로 중단하고 로그를 제공하여 빠른 복구가 가능합니다.

 

주의할 점

  • Jenkins 서버의 디스크 용량 관리 (빌드 아티팩트 자동 정리 설정)
  • Docker 이미지 태그를 고유하게 관리 (빌드 번호 또는 Git SHA 사용)
  • 운영 서버 접근 시 SSH Key 인증 사용 권장
  • 보안을 위해 Jenkins에 HTTPS 설정 적용
  • 배포 실패 시 자동 롤백 로직 추가 고려

 


 

Jenkins를 이용한 CI/CD 파이프라인 구축은 Spring Boot 애플리케이션의 개발 효율과 배포 안정성을 크게 향상시킵니다. 자동화된 빌드·테스트·배포 프로세스를 통해 휴먼 에러를 줄이고, 빠른 피드백 루프를 확보할 수 있습니다.