티스토리 뷰

728x90
반응형

https://kdg-is.tistory.com/270

 

Docker & Jenkins & Spring boot & Gradle CI&CD 배포 방법

개발 환경 젠킨스 서버 : Aws Ubuntu Server 18.04 LTS, t2.micro 개발 서버 : Aws Ubuntu Server 18.04 LTS, t2.micro Spring boot JDK 11 Gradle Git Hub Docker Hub Step 01 - Jenkins EC2 스왑 과정(생략..

kdg-is.tistory.com

 

위의 링크에서는 Freestyle Project 방법으로 구현하였습니다. 지금부터 진행할 예제는 Pipeline을 사용하여 구현하는 방법을 알아보겠습니다.

 

1.Credentials 키를 만듭니다.

Docker Hub와 Git Hub에 접근할 수 있는 2개의 키를 만듭니다.

 

💡 Docker Hub에 로그인할 수 있는 키를 먼저 만들겠습니다.

  • Username - 도커 허브 아이디 입력
  • Password - 도커 허브 비밀번호 입력
  • ID - 파이프 라인 코드에서 식별할 값 입력 (ex: Docker-Hub)

 

💡 Git Hub에 로그인할 수 있는 키를 만들겠습니다.

  • Username - 깃 허브 아이디 입력
  • Password - 깃 허브 access_token
  • ID - 파이프 라인 코드에서 식별할 값 입력 (ex: Git-Hub)

 

2. 새로운 아이템 생성 (Pipeline 프로젝트)

Pipeline으로 새로운 아이템을 하나 만듭니다.

 

💡 General 설정

  • Git Hub의 url을 입력해줍니다.

 

💡 Pipeline 설정

  • DefiDefinition은 Pipeline script로 설정합니다.
  • 하나의 스테이지씩 설명드리겠습니다.
pipeline {
    agent any
    
    environment {
        DOCKER_IMAGE_NAME = 'kdg0209/example' 도커 허브 레포지토리
        DOCKER_IMAGE = ''
    }
    
    stages {
        stage('Prepare') {
            steps {
                sh 'echo "Clonning Repository"'
                git branch: 'dev',
                    url: 'https://github.com/kdg0209/example.git',
                    credentialsId: 'Git-Hub'
            }
            post {
                success { 
                     sh 'echo "Successfully Cloned Repository"'
                 }
                 failure {
                     sh 'echo "Fail Cloned Repository"'
                 }
            }
        }
    
        stage('Bulid Gradle') {
            steps {
                sh 'echo "Bulid Gradle Start"'
                dir('.') {
                    sh """
                    ./gradlew clean build --exclude-task test
                    """
                }
            }
            post {
                 failure {
                     sh 'echo "Bulid Gradle Fail"'
                }
            }
        }
    
        stage('Bulid Docker') {
            steps {
                sh 'echo " Image Bulid Start"'
                script {
                    DOCKER_IMAGE = docker.build DOCKER_IMAGE_NAME
                }
            }
            
            post {
                failure {
                    sh 'echo "Bulid Docker Fail"'
                }
              }
        }
    
        stage('Push Docker') {
            steps {
                sh 'echo "Docker Image Push Start"'
                script {
                    docker.withRegistry('https://registry.hub.docker.com', "Docker-Hub") {
                        DOCKER_IMAGE.push("latest")
                    }
                    
                }
            }
            post {
                success {
                    sh 'docker rmi $(docker images -q -f dangling=true)'
                }
                failure {
                    error 'Docker Image Push Fail'
                }
            }
        }
        
        
       stage('Remote Server Docker Pull') {
            steps([$class: 'BapSshPromotionPublisherPlugin']) {
                sh 'echo "Remote Server Docker Pull Start"'
                 sshPublisher(
                    continueOnError: false, failOnError: true,
                    publishers: [
                        sshPublisherDesc(
                            configName: "remote-server",
                            verbose: true,
                            transfers: [
                                sshTransfer(
                                    execCommand: "sh /home/scripts/spring-container.sh"
                                )
                            ]
                        )
                    ]
                )
            }
        
            post {
                 success {
                    sh 'echo "Completed Remote Server Docker Pull"'
                }
                failure {
                    sh 'echo "Fail Remote Server Docker Pull"'
                }
            }
        }
    }
}

 

💡 Prepare stage 설정

  • branch - 깃의 브런치를 의미합니다.
  • url - 레포지토리 링크를 의미합니다.
  • CredentialsId - Jenkins Credentials에서 만든 ID를 의미합니다. 즉 깃 허브에 로그인할 수 있는 식별 값입니다. 
    • 필자는 처음 단계에서 Credentials을 만들었습니다. 상단에 내용 있음
stage('Prepare') {
    steps {
        sh 'echo "Clonning Repository"'
            git branch: 'dev',
            url: 'https://github.com/kdg0209/example.git',
            credentialsId: 'Git-Hub'
    }
    post {
        success { 
             sh 'echo "Successfully Cloned Repository"'
         }
         failure {
             sh 'echo "Fail Cloned Repository"'
         }
    }
}

 

💡 Bulid Gradle stage 설정

  • 깃 허브에서 가져온 프로젝트로 빌드를 합니다.
stage('Bulid Gradle') {
    steps {
        sh 'echo "Bulid Gradle Start"'
        dir('.') {
            sh """
            ./gradlew clean build --exclude-task test
            """
        }
    }
    post {
         failure {
             sh 'echo "Bulid Gradle Fail"'
        }
    }
}

 

💡 Bulid Docker stage 설정

  • docker image를 만들기 위하여 빌드를 합니다.
stage('Bulid Docker') {
    steps {
        sh 'echo " Image Bulid Start"'
        script {
            DOCKER_IMAGE = docker.build DOCKER_IMAGE_NAME
        }
    }

    post {
        failure {
            sh 'echo "Bulid Docker Fail"'
        }
      }
}

 

💡 Push Docker stage 설정

  • 빌드한 이미지를 가지고 도커허브에 푸시를 합니다.
  • docker.withRegistry()를 사용하여 Docker Hub에 로그인을 하며 로그인 성공시 빌드한 이미지를 푸시합니다.
  • Docker-Hub는 Jenkins Credentials에서 만든 ID를 의미합니다. 즉 도커 허브에 로그인할 수 있는 식별 값입니다.
    • 필자는 처음 단계에서 Credentials을 만들었습니다. 상단에 내용 있음
  • success 는 성공적으로 되었다면 사용하지 않는 도커 이미지를 삭제합니다. 삭제하는 이유는 쓰레기 이미지가 생기므로 용량을 차지하게 됩니다.
stage('Push Docker') {
    steps {
        sh 'echo "Docker Image Push Start"'
        script {
            docker.withRegistry('https://registry.hub.docker.com', "Docker-Hub") {
                DOCKER_IMAGE.push("latest")
            }

        }
    }
    post {
        success {
            sh 'docker rmi $(docker images -q -f dangling=true)'
        }
        failure {
            error 'This Image Push Fail'
        }
    }
}

 

💡 Remote Server Docker Pull stage 설정

  • 이미지를 도커 허브에 푸시를 했으므로 원격지 서버에서는 해당 이미지를 다운 받고 실행하합니다.
  • Publish Over SSH를 사용하므로 대시보드 > 젠킨스 관리 > 시스템 설정에 설정한 SSH Server의 Name을 사용합니다.
    • 자세한 방법은 위쪽 링크에 들어가셔서 15.Publish Over SSH 설정을 검색한 뒤 참고하시면 됩니다.
stage('Remote Server Docker Pull') {
    steps([$class: 'BapSshPromotionPublisherPlugin']) {
        sh 'echo "Remote Server Docker Pull Start"'
         sshPublisher(
            continueOnError: false, failOnError: true,
            publishers: [
                sshPublisherDesc(
                    configName: "remote-server",
                    verbose: true,
                    transfers: [
                        sshTransfer(
                            execCommand: "sh /home/scripts/spring-container.sh"
                        )
                    ]
                )
            ]
        )
    }

    post {
         success {
            sh 'echo "Completed Remote Server Docker Pull"'
        }
        failure {
            sh 'echo "Fail Remote Server Docker Pull"'
        }
    }
}

 

💡 원격지 서버에서 spring-container.sh 파일 생성

  • 기존에 실행중인 컨테이너를 중지하고 삭제 후 다시 도커 허브에서 다운 받는 형태입니다.
#!/bin/sh

sudo docker rmi -f kdg0209/example || true
sudo docker stop spring-container || true
sudo docker rm -f spring-container || true
sudo docker run -d -p 8080:8080 --name spring-container -e USE_PROFILE=dev kdg0209/example

 

💡 빌드 실행 결과

728x90
반응형