Jenkins로 Spring Boot 애플리케이션 Docker 이미지 자동화 배포하기

조승빈·2025년 4월 15일

CI / CD

목록 보기
6/8

Jenkins 파이프라인 개선기: CI/CD 분리의 필요성

처음에는 하나의 Jenkins 파이프라인으로 빌드부터 배포까지 모두 처리했다.
코드를 가져오고, application.yml 파일을 직접 작성해 빌드 후 Docker 이미지를 생성하고,
Redis 컨테이너를 띄워서 바로 배포까지 진행했다.

이전 방식의 문제점

  • application.yml을 직접 생성하면서 민감한 환경변수가 노출될 위험이 있음
  • Redis, MySQL 등 배포 환경의 구성이 파이프라인 내부에 섞여 관리가 어려움
  • 빌드와 배포가 하나로 묶여 있어서 유연한 실행이 불가능

그래서 CICD를 완전히 분리했다.


CI (Continuous Integration)

  • GitHub에서 코드를 가져와 빌드
  • Docker 이미지 생성 후 DockerHubPush
  • 배포와 무관한 부분만 처리

CD (Continuous Deployment)

  • 서버에서 DockerHub 이미지를 Pull
  • Redis, MySQL 등과 연동해 컨테이너 실행
  • 운영 환경 설정(application.yml)은 Git에 포함하지 않고 서버 내부에 존재

jenkins script

pipeline {
    agent any

    environment {
        GIT_URL = "https://github.com/사용자/레포.git"
        DOCKER_REPO = "dockerhub_id"
        DOCKER_IMAGE = "memo-app"
        DOCKER_TAG = "latest"
        DOCKER_CREDENTIALS_ID = "dockerhub"
    }

    stages {
        stage('Checkout') {
            steps {
                git url: "${GIT_URL}", branch: "main"
            }
        }

        stage('Copy Config') {
            steps {
                sh '''
                    mkdir -p ./src/main/resources
                    cp /var/jenkins_home/config/memoApplication.yml ./src/main/resources/application.yml
                '''
            }
        }

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

        stage('Build Docker Image') {
            steps {
                sh 'docker build -t ${DOCKER_REPO}/${DOCKER_IMAGE}:${DOCKER_TAG} .'
            }
        }

        stage('Push Docker Image') {
            steps {
                withCredentials([usernamePassword(
                    credentialsId: "${DOCKER_CREDENTIALS_ID}",
                    passwordVariable: 'DOCKER_PASSWORD',
                    usernameVariable: 'DOCKER_USERNAME')]) {
                        sh 'echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin'
                        sh 'docker push ${DOCKER_REPO}/${DOCKER_IMAGE}:${DOCKER_TAG}'
                }
            }
        }
    }
}

application.yml은 서버에 저장하고 Jenkins 컨테이너에서 마운트하여 사용

CI 파이프라인 실행 흐름

결과

12번의 시도 끝에 이미지가 정상적으로 docker hub에 업로드 되는 것을 확인했다.

profile
평범

0개의 댓글