처음에는 하나의 Jenkins 파이프라인으로 빌드부터 배포까지 모두 처리했다.
코드를 가져오고, application.yml 파일을 직접 작성해 빌드 후 Docker 이미지를 생성하고,
Redis 컨테이너를 띄워서 바로 배포까지 진행했다.
application.yml을 직접 생성하면서 민감한 환경변수가 노출될 위험이 있음Redis, MySQL 등 배포 환경의 구성이 파이프라인 내부에 섞여 관리가 어려움그래서 CI와 CD를 완전히 분리했다.
GitHub에서 코드를 가져와 빌드Docker 이미지 생성 후 DockerHub에 PushDockerHub 이미지를 PullRedis, MySQL 등과 연동해 컨테이너 실행application.yml)은 Git에 포함하지 않고 서버 내부에 존재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컨테이너에서 마운트하여 사용

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

