본문 바로가기

CI_CD

NCP(네이버클라우드플랫폼), Jenkins, Docker를 활용한 무중단 배포해보기 : 다시 처음부터 : 3. Docker에 spring 이미지 실행, Jenkins pipeline 작성, 배포 자동화

https://jootang2.tistory.com/102

 

NCP(네이버클라우드플랫폼), Jenkins, Docker를 활용한 무중단 배포해보기 : 다시 처음부터 : 2. Docker, J

https://jootang2.tistory.com/101 NCP(네이버클라우드플랫폼), Jenkins, Docker를 활용한 무중단 배포해보기 : 다시 처음부터 : 1.서버 생 이전 글들은 아예 서버를 만들 때 네이버에서 제공해주는 jenkins 서비스

jootang2.tistory.com

위 게시물까지 따라했으면 이제 깃 클론을 받아와서 이미지생성 후 실행하면 배포가 된다.

 

putty로 서버에 접속 후 

  • sudo mkdir /docker_projects
  • sudo rm -rf /docker_projects/aaaaa/project
  • sudo mkdir -p /docker_projects/aaaaa/project
  • sudo chown lldj: -R /docker_projects/aaaaa/project
  • cd /docker_projects/aaaaa/project
  • git clone repository주소
  • chmod 744 ./gradlew

그래들 빌드

  • ./gradlew clean build

이미지를 만들어 주기 전에 spring에 dockerfile을 추가해줘야 이미지를 만들 수 있다.

FROM openjdk:17 //java 버전
ARG JAR_FILE=build/libs/프로젝트이름-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

그래들 빌드에 성공했으면 이미지를 만들어 준다.

  • docker build -t aaaaa .

이미지 생성에 성공했으면 실행해준다.

docker run \
  --name=aaaaa \
  -p 8080:8080 \
  -v /docker_projects/aaaaa/volumes/gen:/gen \
  --restart unless-stopped \
  -e TZ=Asia/Seoul \
  -d \
  aaaaa

 

docker ps 를 치면 돌아가고 있는 컨테이너들을 볼 수 있다.

 

배포 자동화 하기 

목표 : 깃에 푸시를 하면 웹훅으로 감지해서 파이프라인을 통해 위 과정을 자동화 시킨다.

 

젠킨스 주소로 접속해서 새로운 아이템을 파이프라인으로 생성한다.

GitHub hook trigger를 체크해주고 파이프 라인을 작성한다.

pipeline {
    agent any
    
    tools {
        jdk 'openjdk-17-jdk'
    }
    
    stages {
        stage('Prepare') {
            steps {
                git branch: 'master',
                    url: 'https://github.com/jootang2/aaaaa'
            }
            
            post {
                success { 
                    sh 'echo "Successfully Cloned Repository"'
                }
                failure {
                    sh 'echo "Fail Cloned Repository"'
                }
            }    
        }
        
        stage('Build Gradle Test') {
            
            steps {
                sh (script:'''
                    echo "Build Gradle Test Start"
                ''')

                dir('.') {
                    sh """
                    chmod +x gradlew
                    """
                }
                
                dir('.') {
                    sh """
                    ./gradlew clean build
                    """
                }
            }
            
            post {
                success { 
                    sh 'echo "Successfully Build Gradle Test"'
                }
                 failure {
                    sh 'echo "Fail Build Gradle Test"'
                }
            }    
        }
        
        stage('Docker Rm') {
            steps {
                sh 'echo "Docker Run Start"'
                sh """
                docker stop timecapsule
                docker rm -f timecapsule
                docker rmi -f timecapsule
                """
            }
            
            post {
                success { 
                    sh 'echo "Docker Rm Success"'
                }
                failure {
                    sh 'echo "Docker Rm Fail"'
                }
            }
        }
        
        stage('Bulid Docker Image') {
            steps {
                sh 'echo " Image Bulid Start"'
                sh """
                docker build -t timecapsule .
                """
            }
            
            post {
                success {
                    sh 'echo "Bulid Docker Image Success"'
                }

                failure {
                    sh 'echo "Bulid Docker Image Fail"'
                }
            }
        }
        
        stage('Docker Run') {
            steps {
                sh 'echo "Docker Run Start"'
                sh """
                docker run \
                  --name=timecapsule \
                  -p 80:8080 \
                  -v /docker_projects/aaaaa/volumes/gen:/gen \
                  --restart unless-stopped \
                  -e TZ=Asia/Seoul \
                  -d \
                  aaaaa
                """
            }
            
            post {
                success {
                    sh 'echo "Docker Run Success"'
                }

                failure {
                    sh 'echo "Docker Run Fail"'
                }
            }
        }
    }
}

 

위 파이프라인은 예시로만 한거라서 깃 레포지토리 주소를 각자 주소로 다시 설정해주어야 한다.

 

정상적으로 작동되면

1. 깃 레포지토리에 푸시 => 2. 웹훅을 통해 젠킨스가 감지 => 3. 젠킨스가 파이프라인을 통해 

클론을 받아와서 실행중인 컨테이너 종료, 새로운 이미지 생성 후 실행 한다.

푸시만 하면은 자동으로 위 과정들이 실행된다.

 

 

중간중간 생략한 부분들도 있고 각자 프로젝트에 따라서 달라지는 상황이 많다.

하지만 큰 틀은 있으니까 이런 방향으로 하면 어렵지 않게 배포까지 가능하다.

 

중간에 포기하지 않고 계속 검색하고 여러 시도를 한다면 무조건 된다.

 

나도 중간에 3~4번은 처음부터 다시 시작했다.

 

배포 끝!