๐Ÿ’ป BackEnd

๐Ÿ’ป[Jenkins] ์  ํ‚จ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Dbswnstjd 2023. 11. 8. 17:22

jenkins

 

1. ์  ํ‚จ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋จผ์ € ์  ํ‚จ์Šค๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์ „, CI/CD์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

  • CI (Continuous Integration)
    • ์ง€์†์ ์ธ ํ†ตํ•ฉ
    • ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž ๋“ค์ด ์ง€์†์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ
  • CD (Continuous Deployment / Continuous Delivery)
    • ์ง€์†์ ์ธ ๋ฐฐํฌ
    • ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค์„ ํ…Œ์ŠคํŠธ์™€ ๋นŒ๋“œ๋ฅผ ๊ฑฐ์น˜๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž๋™์œผ๋กœ ๋ฐฐํฌ

CI/CD

CI/CD ๊ณผ์ •์ธ ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

1. ๋กœ์ปฌ์—์„œ ๊ฐœ๋ฐœ ํ›„ ์ปค๋ฐ‹

2. Github WebHook ์„ ์ด์šฉํ•ด ์  ํ‚จ์Šค์—๊ฒŒ ์ „๋‹ฌ

3. ๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐฐํฌ ์„œ๋ฒ„๋กœ ์ „์†ก

4. ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•  ๊ฒฝ์šฐ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์•Œ๋ฆผ

์  ํ‚จ์Šค ํŒŒ์ดํ”„ ๋ผ์ธ ๊ตฌ์„ฑ

 

๋‹ค์Œ์€ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์‹œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•œ ์˜ˆ์‹œ์ด๋‹ค. ์  ํ‚จ์Šค + ๋„์ปค๋ฅผ ์ด์šฉํ•ด ์  ํ‚จ์Šค ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ  ๊ทธ ์•ˆ์—์„œ ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๋„์ปค์ธ๋„์ปค ๋ฐฉ์‹์œผ๋กœ ์ฒ˜์Œ์— ๊ตฌ์ถ•์„ ํ•˜๋‹ค๊ฐ€ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค์—์„œ ์šด์˜์„œ๋ฒ„์™€ ๊ฐœ๋ฐœ์„œ๋ฒ„๋ฅผ ๋‚˜๋ˆ„์–ด์•ผ ํ•ด์„œ docker daemon์„ ์ด์šฉํ•ด ๋„์ปค์•„์›ƒ์˜ค๋ธŒ๋„์ปค๋กœ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค. 

ํŒŒ์ดํ”„ ๋ผ์ธ์˜ ๊ตฌ์„ฑ์€ agent section, post section, stages section, declaratives, steps ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

pipeline {
    agent any

    environment {
        DOCKER_IMAGE = '์ด๋ฏธ์ง€ ์ด๋ฆ„'
        DOCKER_CONTAINER = '์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„'
        DOCKER_HUB_IMAGE = '๋„์ปค ํ—ˆ๋ธŒ ์ด๋ฏธ์ง€ ์ด๋ฆ„'
        TARGET_DIRECTORY = '์ด๋™ํ•˜๊ณ  ์‹ถ์€ dir'
    }

    stages {
        stage('Clone Git Repository') {
            steps {
                git url: 'github URL'
                echo 'Git Clone SUCCESS'
            }
            post {
                success {
                    echo 'Git Clone stage succeeded!'
                }
                failure {
                    echo 'Git Clone stage failed!'
                }
            }
        }

        stage('Stop and Remove Docker Container') {
            when {
                expression { isContainerRunning() }
            }
            steps {
                script {
                    // If the container is running, stop it
                    sh "docker stop ${DOCKER_CONTAINER}"
                    // Remove the stopped container
                    sh "docker rm ${DOCKER_CONTAINER}"
                }
            }
            post {
                success {
                    echo 'Remove Docker Container Success!'
                }
                failure {
                    echo 'Remove Docker Container Fail!'
                }
            }
        }

        stage('Remove Existing Docker Image') {
            when {
                expression { doesImageExist() }
            }
            steps {
                script {
                    // If the Docker image exists, remove it
                    echo "Docker image : ${DOCKER_IMAGE}"
                    sh "docker rmi ${DOCKER_IMAGE}"
                }
            }
            post {
                success {
                    echo 'Remove Existing Docker Image Success!'
                }
                failure {
                    echo 'Remove Existing Docker Image Fail!'
                }
            }
        }

        stage('Build Docker Image') {
            steps {
                script {
                    dir(TARGET_DIRECTORY) {
                        // Build the Docker image from the Dockerfile in the current directory
                        sh "docker build -t ${DOCKER_IMAGE} ."
                    }
                }
            }
            post {
                success {
                    echo 'Build Docker Image Success!'
                }
                failure {
                    echo 'Build Docker Image Fail!'
                }
            }
        }

        stage('Push Docker Image to Docker Hub') {
            steps {
                script {
                    withCredentials([usernamePassword(credentialsId: 'docker-hub', usernameVariable: 'DOCKER_HUB_USERNAME', passwordVariable: 'DOCKER_HUB_PASSWORD')]) {
                        sh "docker login -u $DOCKER_HUB_USERNAME -p $DOCKER_HUB_PASSWORD"
                        sh "docker tag ${DOCKER_IMAGE} ${DOCKER_HUB_IMAGE}:latest"
                        sh "docker push ${DOCKER_HUB_IMAGE}:latest"
                    }
                }
            }
            post {
                success {
                    echo 'Push Docker Image to Docker Hub Success!'
                }
                failure {
                    echo 'Push Docker Image to Docker Hub Fail!'
                }
            }
        }

        stage('Pull and Run Docker Container') {
            steps {
                script {
                    dir(TARGET_DIRECTORY) {
                        // Pull the Docker image from Docker Hub
                        sh "docker pull ${DOCKER_HUB_IMAGE}:latest"
                        // Run the Docker container
                        sh "docker run -d -p 80:80 -p 443:443 --name ${DOCKER_CONTAINER} ${DOCKER_HUB_IMAGE}:latest"
                    }
                }
            }
            post {
                success {
                    echo 'Docker Image Pull And Run Success!'
                }
                failure {
                    echo 'Docker Image Pull And Run Fail!'
                }
            }
        }
    }

    post {
        success {
            echo 'Pipeline executed successfully!'
        }
    }
}

def isContainerRunning() {
    def isRunning = sh(script: "docker ps -q -f name=${DOCKER_CONTAINER}", returnStatus: true)
    return isRunning == 0
}

def doesImageExist() {
    def imageExists = sh(script: "docker images -q ${DOCKER_IMAGE}", returnStatus: true)
    return imageExists == 0
}

 

๋‚ด ๋‚˜๋ฆ„๋Œ€๋กœ ์ฐพ์•„๋ณด๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์„ ์ž‘์„ฑํ•˜์˜€๋‹ค. ์  ํ‚จ์Šค ์„ค์ •๊ณผ ์„ค์น˜๋Š” ๋‹ค์Œ์— ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ํŒŒ์ดํ”„ ๋ผ์ธ์„ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋กœ์ปฌ์—์„œ ์ปค๋ฐ‹ ์‹œ ์ž๋™์œผ๋กœ ์  ํ‚จ์Šค์—์„œ ๋นŒ๋“œ ํ›„ ๋ฐฐํฌ๊นŒ์ง€ ๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ์—ˆ๋‹ค. 

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ๊ธ€์—์„œ ๋งŒ๋‚˜๋ณด๋„๋ก..