관리 메뉴

ballqs 님의 블로그

[CI/CD] 자동 배포 파이프 라인 (3) - Jenkins Item Add Build Test 본문

코딩 공부/CI-CD

[CI/CD] 자동 배포 파이프 라인 (3) - Jenkins Item Add Build Test

ballqs 2024. 11. 17. 20:24

이전 글에 인해 Jenkins에서 사용할 온갖 설정들이 다되었습니다.

이제 Item을 추가하여 Build까지 되는것까지의 내용입니다.

 

Jenkins Item 추가

Enter an item name 에 명칭 넣고 파이프라인 선택 후 OK 누르면 됩니다.

 

GitHub project에는 적용하고자 하는 git repository를 작성해줍니다.

GitHub hook trigger for GITScm polling 도 체크하기!!!

 

 

Pipeline에 Script 작성!!

pipeline {
    agent any
    environment {
        AWS_PUBLIC_IP = 'ubuntu@43.200.191.68'
        DOCKER_HUB = 'aysel0413'
        DOCKER_IMAGE = 'nbcamp-spring-jpa-task'
        DOCKER_TAG = '0.1'
    }
    stages {
        stage('start') {
            steps {
                slackSend (
                    channel: '#jenkins', 
                    color: '#FFFF00', 
                    message: "START: Job ${env.JOB_NAME} [${env.BUILD_NUMBER}]"
                )
            }
        }
        
        stage('Git Clone') {
            steps {
                git branch: 'dev', 
                credentialsId: 'github-access-token', 
                url: 'https://github.com/ballqs/nbcamp-spring-jpa-task.git'
            }
        }
        
        stage('Build') {
            steps {
                // Gradle 실행권한
                dir('./') {
                    sh 'chmod +x ./gradlew'
                // Gradle 빌드 실행
                    sh './gradlew clean build'   
                }
            }
        }
        
        stage('Test'){
            steps {
                dir('./') {
                    sh './gradlew test'    
                }
            }
        }
        
        stage('DockerFile Build') {
            steps{
                dir("./") {
                    script {
                        dockerimage = docker.build("${DOCKER_HUB}/${DOCKER_IMAGE}:${DOCKER_TAG}")
                    }
                }   
            }
        }
        
        stage('Docker Image Push') {
            steps {
                script {
                    withDockerRegistry(credentialsId:"docker-access") {
                        dockerimage.push()
                    }
                }
            }
        }
        
        stage('Deploy') {
          steps {
              sshagent(credentials: ['aws_key']) {
                    sh '''
                        ssh -o StrictHostKeyChecking=no ${AWS_PUBLIC_IP} << EOF
                        docker container stop app
                        docker image prune -f
                        docker pull ${DOCKER_HUB}/${DOCKER_IMAGE}:${DOCKER_TAG}
                        docker run -d --rm -p 8080:8080 --env-file ./config/.env --name app ${DOCKER_HUB}/${DOCKER_IMAGE}:${DOCKER_TAG}
                        exit
                        EOF
                    '''
                }
            }
        }
    }
    // 테스트 후 성공 실패 여부에 따른 슬랙 알람 전송
    post {
        success {
            slackSend (
                channel: '#jenkins', 
                color: '#00FF00', 
                message: """
                        SUCCESS: Job ${env.JOB_NAME} [${env.BUILD_NUMBER}]
                        """
            )
        }
        failure {
            slackSend (
                channel: '#jenkins', 
                color: '#FF0000', 
                message: "FAIL: Job ${env.JOB_NAME} [${env.BUILD_NUMBER}]"
            )
        }
    }
}

 

 

이 Jenkins 파이프라인 설정은 코드 빌드, 테스트, Docker 이미지 생성 및 배포까지 자동화된 프로세스를 정의합니다.

각 단계에 대한 설명은 다음과 같습니다:

  1. pipeline 블록: Jenkins 파이프라인을 정의하는 최상위 블록입니다. 이 블록 안에는 agent, environment, stages 등이 포함됩니다.
  2. agent any: Jenkins가 사용할 노드를 지정합니다. any는 사용할 수 있는 모든 노드에서 작업이 실행될 수 있음을 의미합니다.
  3. environment 블록:
    • DOCKER_HUB, DOCKER_IMAGE, DOCKER_TAG, AWS_PUBLIC_IP는 환경 변수로 설정되어, 여러 단계에서 참조됩니다. 이를 통해 코드 내에서 반복적으로 사용되는 값을 중앙에서 관리할 수 있습니다.
  4. stages 블록: 파이프라인의 각 단계를 정의합니다.
    • stage('Start'): 작업이 시작될 때 Slack 알림을 보냅니다. Jenkins 환경 변수 env.JOB_NAME과 env.BUILD_NUMBER를 포함하여 작업명과 빌드 번호를 메시지로 보냅니다.
    • stage('Git Clone'): Git 리포지토리에서 코드를 클론합니다. branch는 클론할 브랜치를, credentialsId는 인증에 사용할 자격 증명을 나타냅니다.
    • stage('Build'): 프로젝트를 빌드하기 위해 Gradle 명령어를 실행합니다. chmod +x ./gradlew는 Gradle wrapper(gradlew)에 실행 권한을 부여하고, ./gradlew clean build는 빌드 명령어입니다.
    • stage('Test'): 테스트 단계를 실행합니다. Gradle의 ./gradlew test 명령어를 사용해 코드의 테스트를 수행합니다.
    • stage('Docker Build'): Docker 이미지를 빌드합니다. docker.build()를 통해 Docker 이미지가 빌드되고, ${DOCKER_HUB}/${DOCKER_IMAGE}:${DOCKER_TAG} 형식의 태그가 적용됩니다.
    • stage('Docker Image Push'): 빌드된 Docker 이미지를 Docker Hub로 푸시합니다. withDockerRegistry는 Docker Hub 인증을 처리하기 위한 래퍼로, credentialsId를 통해 인증 정보를 참조합니다.
    • stage('Deploy'): AWS 서버에 SSH로 접속해 기존 컨테이너를 중지하고, 새 Docker 이미지를 가져와 실행합니다. sshagent는 SSH 키 인증을 처리하며, sh 명령어는 원격 서버에서 스크립트를 실행합니다. docker pull, docker run 명령어를 사용해 이미지를 다운로드하고 새로운 컨테이너를 배포합니다.
  5. post 블록: 각 단계가 종료된 후 실행되는 블록입니다.
    1. success 블록: 파이프라인이 성공적으로 완료되면 #jenkins 채널로 성공 메시지를 보냅니다. 초록색 색상(color: '#00FF00')이 사용됩니다.
    2. failure 블록: 파이프라인이 실패하면 빨간색 색상(color: '#FF0000')과 함께 실패 메시지를 보냅니다.

 

※위의 구성대로 진행시 알림 결과

 

Github Webhooks 설정

Payload URL : [Jenkins가 설치된 URL]/github-webhook/

Content type: application/json

 

※로컬 구현의 경우!

더보기

ngrok

https://download.ngrok.com/windows

 

Download ngrok

Download ngrok

download.ngrok.com

 

환경에 맞게 다운로드 후 회원가입하여 토큰 확인합니다.

 

 

그럼 다운 받은 폴더로가서 압축을 풀고

실행 후 아래 명령어 실행

ngrok config add-authtoken [TOKEN]

ngrok http localhost:[Jenkins PORT]

 

 그러면 이와 같이 localhost:[Jenkins PORT] 값을 다른 url로 포워딩 해준다.

해당 url 값으로 진행하면 로컬에도 문제없이 가능하다.

 

AWS

AWS에 EC2를 생성하는 건 생략하고 내부로 들어와서 설정하는 방법을 작성하고자 합니다.

로컬 개발시 사용하던 .env파일 부분을 끌어와서 사용하기 위해 미리 설정합니다.

 

cd ~ 인 곳에서

mkdir config 폴더를 만들고

거기에서

vi .env

#.env 파일 내용
DB_IP=localhost  # db가 사용중일때 rds로 구축해서 이부분 변경할 것
DB_PORT=3306
DB_NM=nbc_spring_jpa_task
DB_ID=root       # 이부분 또한 admin으로 변경
DB_PW=1234       # password 설정한 값으로 변경

JWT_KEY=7Iqk7YyM66W07YOA7L2U65Sp7YG065+9U3ByaW5n6rCV7J2Y7Yqc7YSw7LWc7JuQ67mI7J6F64uI64ukLg==

※ 실제로 진행한 프로젝트의 .env 파일 기반이 아닙니다.

 

aws mysql 설치

// MYSQL 설치
sudo apt install mysql-server

 

aws 도커 설치 과정!

// 업데이트
sudo apt update

// https관련 패키지 설치
sudo apt install apt-transport-https ca-certificates curl software-properties-common

// 도커 다운로드
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

// docker repository 등록
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

// 다시 업데이트
sudo apt update

// 도커 설치
sudo apt install docker-ce

// 설치 확인
docker --version

 

그리고 해당 docker hub의 올려둔 프로젝트 내용을 가져와서 배포하면 된다.

 

docker도 무사히 실행되었다는 증거로 데이터베이스에 테이블이 생성된 것을 확인했다.

※DB는 AWS RDS로 만들어서 진행했다.

 

빌드 방법!

Jenkins에서 빌드하기!

 

이렇게 build를 해보면 잘되는 것을 확인할 수 있습니다.