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"
            }
        }
    }
}