Skip to content

[BE] 집사의고민 배포 자동화 파이프라인

wyc edited this page Sep 12, 2023 · 2 revisions

배포 자동화 파이프라인

자동화 툴 선택하기

배포 자동화 파이프라인을 구축하기 위해 Jenkins를 사용하였습니다. Github Action, Travis CI, Circle CI 등등 많은 자동화 툴 선택지가 있지만, 집사의고민팀은 Jenkins를 선택했습니다.

자세한 이유는 이 문서를 확인해주세요.

집사의고민 파이프라인은 main, develop 브랜치에 push 또는 Pull Request Merged 등의 이벤트가 발생하면 깃허브 웹 훅이 트리거를 발생시켜 젠킨스가 동작하는 구조입니다. 젠킨스가 파이프라인 스크립트대로 실행 완료 후 배포스크립트를 실행하여 서버가 운영환경에서 정상적으로 서버가 동작하게 됩니다.

스크린샷 2023-08-17 11 18 42

파이프라인 동작 과정은 다음과 같습니다.

  1. develop 또는 main 브랜치에 깃 Push 또는 Merge
  2. 깃허브 웹 훅이 Jenkins로 트리거 전달
  3. 젠킨스의 Multibranch Pipeline이 develop과 main 브랜치를 분기
  4. 파이프라인 스크립트 실행
  5. 생성된 JAR 파일을 zipgo-prod 인스턴스로 복사
  6. zipgo-prod에서 배포 스크립트로 해당 JAR 파일 실행
  7. 배포 성공/실패 여부 슬랙 알림 전송

파이프라인 스크립트 살펴보기

pipeline {
    agent any
    tools {
        gradle 'gradle'
    }
    stages {
        // 1
        stage('checkout') {
            steps {
                git branch: env.GIT_BRANCH,
                credentialsId: 'github_access_token',
                url: 'https://github.com/woowacourse-teams/2023-zipgo'
            }
        }

        // 2
        stage('build project') {
            steps {
                dir('backend') {
                    sh './gradlew clean build'
                }
            }
        }

        // 3
        stage('deploy develop') {
           
            // 3-1
            when {
                expression { env.GIT_BRANCH == 'develop' }
            }
            // 3-2
            steps {
                dir('backend') {
                    sshagent(credentials: ['prod_instance_key']) {
                        sh '''
                            ssh -o StrictHostKeyChecking=no ${env.PROD_SERVER_PRIVATE_IP} uptime
                            scp build/libs/zipgo-backend-0.0.1-SNAPSHOT.jar ${env.PROD_SERVER_PRIVATE_IP}:/home/ubuntu/develop
			    scp deploy-dev.sh ${env.PROD_SERVER_PRIVATE_IP}:/home/ubuntu/develop
                            ssh ${env.PROD_SERVER_PRIVATE_IP} sudo chmod +x /home/ubuntu/develop/deploy-dev.sh
                            ssh -t ${env.PROD_SERVER_PRIVATE_IP} ./develop/deploy-dev.sh
                        '''
                    }
                }
            }
        }

        // 4
        stage('deploy production') {

            // 4-1
            when {
                expression { env.GIT_BRANCH == 'main' }
            }

            // 4-2
            steps {
                dir('backend') {
                    sshagent(credentials: ['prod_instance_key']) {
                        sh '''
                            ssh -o StrictHostKeyChecking=no ${env.PROD_SERVER_PRIVATE_IP} uptime
                            scp build/libs/zipgo-backend-0.0.1-SNAPSHOT.jar ${env.PROD_SERVER_PRIVATE_IP}:/home/ubuntu/production
                            scp deploy-prod.sh ${env.PROD_SERVER_PRIVATE_IP}:/home/ubuntu/production
                            ssh ${env.PROD_SERVER_PRIVATE_IP} sudo chmod +x /home/ubuntu/production/deploy-prod.sh
                            ssh -t ${env.PROD_SERVER_PRIVATE_IP} ./production/deploy-prod.sh
                        '''
                    }
                }
            }
        }
    }
    post {
        success {
            slackSend (channel: '#백엔드-배포', color: '#00FF00', message: "배포 성공: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
        }
        failure {
            slackSend (channel: '#백엔드-배포', color: '#FF0000', message: "배포 실패: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})")
        }
    }
}
  1. 깃허브 레파지토리를 젠킨스로 clone 합니다. 2.woowacourse-teams의 레파지토리들은 모두 모노 레포 형태이기 때문에 backend dir로 들어가서 build 해줍니다.
  2. 개발 서버 배포 스테이지입니다.

3-1. 개발 서버를 배포하는 브랜치인지 검증합니다.
3-2. 개발 서버를 배포합니다.

  1. 운영 서버 배포 스테이지입니다.

4-1. 운영 서버를 배포하는 브랜치인지 검증합니다.
4-2. 운영 서버를 배포합니다.

배포 스크립트 살펴보기

#!/bin/sh
PROJECT_NAME=zipgo-backend

echo '> production 서버를 실행합니다'
echo '> 현재 구동중인 애플리케이션 PID 확인'
CURRENT_PID=$(sudo netstat -lntp | grep 8080 | awk '{print $7}' | cut -d'/' -f1)

echo "현재 구동중인 애플리케이션 PID: $CURRENT_PID"

if [ -z "$CURRENT_PID" ]; then
    echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
    echo "> kill -15 $CURRENT_PID"
    sudo kill -15 $CURRENT_PID
    sleep 5
    if ps -p $CURRENT_PID > /dev/null; then
        echo "> 애플리케이션을 다시 종료합니다."
        sudo kill -9 $CURRENT_PID
    else
        echo "> 프로세스 아이디 $CURRENT_PID 가 성공적으로 종료되었습니다."
    fi
fi

sudo chmod +x ~/production/zipgo-backend-0.0.1-SNAPSHOT.jar
sudo nohup java -jar \
-Dspring.profiles.active=prod \
-Dspring.config.import=file:/home/ubuntu/production/env.properties \
~/production/zipgo-backend-0.0.1-SNAPSHOT.jar > ~/production/application.log 2>&1 &

Stage View

스크린샷 2023-08-17 11 20 11

파이프라인 성공 시 슬랙 알림

스크린샷 2023-08-17 11 54 33

파이프라인 실패 시 슬랙 알림

스크린샷 2023-08-17 11 57 14
Clone this wiki locally