CICD
[CICD] 도커 - 젠킨스 파이프라인 스크립트
김호록님
2025. 6. 11. 14:45
이틀 내내 삽질을 정말 많이 해서.. (하루는 환경변수 주입이 안 돼서 하루종일 환경변수 구글링만 함ㅜㅜ)
기록용으로 현재 빌드 성공한 스크립트 및 설정을 적어두려고 한다.
환경변수 설정 할 때 '이 빌드는 매개변수가 있습니다' 설정에서 파라미터를 등록하라는 글이 있어서 따라해봤었는데, 결과적으로 잘 되지 않았다. 그래서 일단 젠킨스 자체에 시크릿 키를 등록해두고 해당 키들을 환경변수로 적용하는 방법을 사용했다.
추후 더 좋은 방법이 있으면 적용할 생각이다.
pipeline
pipeline {
agent any
environment {
IMAGE_NAME = "jenkins-server"
CONTAINER_NAME = "cogroom-app"
PORT = "8080"
DB_URL = credentials('DB_URL')
DB_USER = credentials('DB_USER')
DB_PASSWORD = credentials('DB_PASSWORD')
DB_DRIVER = credentials('DB_DRIVER')
SMTP_ADDRESS = credentials('SMTP_ADDRESS')
SMTP_PASSWORD = credentials('SMTP_PASSWORD')
EMAIL_LINK_URL = credentials('EMAIL_LINK_URL')
KAKAO_REST_API_KEY = credentials('KAKAO_REST_API_KEY')
JWT_SECRET_KEY = credentials('JWT_SECRET_KEY')
JWT_ACCESS_EXPIRATION = credentials('JWT_ACCESS_EXPIRATION')
JWT_REFRESH_EXPIRATION = credentials('JWT_REFRESH_EXPIRATION')
S3_BUCKET = credentials('S3_BUCKET')
S3_REGION = credentials('S3_REGION')
CLOUD_FRONT_URL = credentials('CLOUD_FRONT_URL')
S3_ACCESS_KEY = credentials('S3_ACCESS_KEY')
S3_SECRET_KEY = credentials('S3_SECRET_KEY')
}
stages {
stage('Clone Source') {
steps {
git branch: 'develop',
credentialsId: 'github_access_token',
url: 'https://github.com/Oncognier/cogroom-be.git'
}
}
stage('Build JAR') {
steps {
sh '''
chmod +x ./gradlew
./gradlew clean build
'''
}
}
stage('Build Docker Image') {
steps {
sh "docker build -t ${IMAGE_NAME}:latest ."
}
}
stage('Stop & Remove Old Container') {
steps {
sh """
docker stop ${CONTAINER_NAME} || true
docker rm ${CONTAINER_NAME} || true
"""
}
}
stage('printEnv') {
steps {
sh 'printenv'
}
}
stage('Run New Container') {
steps {
sh '''#!/bin/bash
docker run -d \\
--name "$CONTAINER_NAME" \\
-p "$PORT":8080 \\
-e DB_URL="$DB_URL" \\
-e DB_USER="$DB_USER" \\
-e DB_PASSWORD="$DB_PASSWORD" \\
-e DB_DRIVER="$DB_DRIVER" \\
-e SMTP_ADDRESS="$SMTP_ADDRESS" \\
-e SMTP_PASSWORD="$SMTP_PASSWORD" \\
-e EMAIL_LINK_URL="$EMAIL_LINK_URL" \\
-e KAKAO_REST_API_KEY="$KAKAO_REST_API_KEY" \\
-e JWT_SECRET_KEY="$JWT_SECRET_KEY" \\
-e JWT_ACCESS_EXPIRATION="$JWT_ACCESS_EXPIRATION" \\
-e JWT_REFRESH_EXPIRATION="$JWT_REFRESH_EXPIRATION" \\
-e S3_BUCKET="$S3_BUCKET" \\
-e S3_REGION="$S3_REGION" \\
-e CLOUD_FRONT_URL="$CLOUD_FRONT_URL" \\
-e S3_ACCESS_KEY="$S3_ACCESS_KEY" \\
-e S3_SECRET_KEY="$S3_SECRET_KEY" \\
"$IMAGE_NAME":latest
'''
}
}
stage('Cleanup Old Images') {
steps {
script {
// 사용하지 않는 Docker 이미지 정리
sh "docker image prune -f"
}
}
}
}
post {
success {
withCredentials([string(credentialsId: 'Discord-webhook', variable: 'DISCORD')]) {
discordSend description: """
제목 : ${currentBuild.displayName}
결과 : ${currentBuild.result}
실행 시간 : ${currentBuild.duration / 1000}s
""",
footer: "🚀 배포 성공!",
link: env.BUILD_URL, result: currentBuild.currentResult,
title: "${env.JOB_NAME} : ${currentBuild.displayName} 성공",
webhookURL: "$DISCORD"
}
}
failure {
withCredentials([string(credentialsId: 'Discord-webhook', variable: 'DISCORD')]) {
discordSend description: """
제목 : ${currentBuild.displayName}
결과 : ${currentBuild.result}
실행 시간 : ${currentBuild.duration / 1000}s
""",
footer: "❌ 배포 실패. 로그 확인이 필요합니다.",
link: env.BUILD_URL, result: currentBuild.currentResult,
title: "${env.JOB_NAME} : ${currentBuild.displayName} 실패",
webhookURL: "$DISCORD"
}
}
}
}