DevOps/AWS

[AWS] 기본적인 배포 스크립트

발달중인 망고 2023. 11. 14. 00:08

본 게시글은 [K-디지털] 개발자를 위한 AWS DevOps 입문(CI/CD 무중단 배포) 온라인 과정 중 일부를 복습하는 글입니다.

오늘은 기본적인 배포 스크립트 구성을 알아보도록 하겠습니다. 최대한 한줄한줄 뜯어보며 복습하겠습니다.

 

var.sh

#!/bin/bash

GITHUB_ID="codingspecialist"
PROJECT_NAME="aws-v2"
PROJECT_VERSION="0.0.1"
PROJECT_PID="$(pgrep -f ${PROJECT_NAME}-${PROJECT_VERSION}.jar)"
JAR_PATH="${HOME}/${PROJECT_NAME}/build/libs/${PROJECT_NAME}-${PROJECT_VERSION}.jar"

export GITHUB_ID
export PROJECT_NAME
export PROJECT_VERSION
export PROJECT_PID
export JAR_PATH

 

var.sh 파일은 클라우드나 서버 환경에서 자바 프로젝트를 관리하기 위한 환경 변수 설정에 관한 것입니다.

#!/bin/bash: 이 줄은 스크립트가 Bash 쉘에서 실행되어야 함을 지정합니다. 스크립트가 시작될 때 어떤 인터프리터를 사용할지 결정합니다.

 

GITHUB_ID, PROJECT_NAME 두 변수는 각각 다를 수 있습니다. 실제 깃허브에서 Project를 다운로드할 때 그 프로젝트명과 배포자의 ID를 입력하시면 됩니다.

 

PROJECT_PID : 환경 변수에 pgrep 명령어를 사용해 프로젝트의 프로세스 ID를 찾아 저장합니다. 여기서 -f 옵션은 프로세스 이름을 정확하게 매칭하는 것이 아니라, 커맨드 라인에서 주어진 패턴을 찾습니다.

 

export: 이 줄들은 앞서 정의한 각 환경 변수들을 실제 환경 변수로 내보내어 (export) 쉘 스크립트나 다른 프로세스에서 사용할 수 있도록 합니다.


 

deploy.sh

#!/bin/bash

# 1. env variable
source ./var.sh

echo "1. env variable setting complete"

# 2. clone delete
touch crontab_delete
crontab crontab_delete
rm crontab_delete
echo "2. cron delete complete"

# 3.server checking
if [ -n "${PROJECT_PID}" ]; then
  # re deploy
  kill -9 $PROJECT_PID
  echo "3. project kill complete...."
else
  # first deploy

  # 3-1 apt update bash에서는 apt-get이라고 꼭 써줘야함and -y옵션을 걸어서 중간에 안멈추도록
  sudo apt-get -y update 1>/dev/null
  echo "3-1 apt update complete"

  # 3-2 jdk install
  sudo apt-get -y install openjdk-11-jdk 1>/dev/null
  echo "3-2 jdk install complete"

  # 3-3 timezone
  sudo timedatectl set-timezone Asia/Seoul
  echo "3-3 timezone setting complete"

  echo "3.project install and timezone setting complete"
fi

deploy.sh 파일은 일반적으로 자바 기반 서버 환경에서 프로젝트를 배포하고 관리하는 과정을 자동화하기 위해 사용됩니다.

 

실행하기전 권한 부여

물론 실행하기전 deploy 파일에 u+x를 통해 실행권한을 부여해 줍니다.

 

환경 변수 설정 (source./var.sh): 스크립트는 var.sh 파일에서 환경 변수를 가져옵니다. 이는 프로젝트의 구성, 예를 들어 사용하는 포트 번호, 데이터베이스 연결 정보와 같은 중요한 설정 정보를 포함할 수 있습니다. 환경 변수를 사용함으로써 스크립트를 보다 유연하게 만들어 줍니다.

 

JDK 다운로드 : sudo apt-get -y install openjdk-11-jdk 1>/dev/null의 명령어를 뜯어보며 의미를 알아보겠습니다.

  • 'sudo' : superuser do의 줄임말로, 이 명령어를 사용하면 슈퍼유저의 권한으로 명령을 실행할 수 있습니다.
  • 'apt-get' : 프롬프트에서 직접 install 하는 과정에서는 -get이 필요 없습니다. 하지만 스크립트에서 할 때는 오류가 뜨기에 -get을 붙여줘야 합니다.
  • '-y' : yes라는 옵션을 붙여줍니다. 명령어 실행(ex download) 과정에서 '정말 다운로드하시겠습니까?'와 같은 과정을 자동으로 확인해 주는 옵션입니다.
  • '1>/dev/null' : 일반 출력을 휴지통으로 버린다는 뜻입니다. 다운로드되고 있는 과정을 굳이 볼 필요 없기 때문에 설정해 주시면 좋겠습니다. 아래는 설정하고 안하고의 차이를 보여드리겠습니다.

일반 출력 제거 설정을 안했을때

 

일반 출력 제거 설정을 했을때

 

크론 작업 삭제 (crontab 명령어 사용): 스크립트는 모든 크론(cron) 작업을 삭제합니다. 크론은 리눅스 시스템에서 정기적으로 실행되어야 하는 작업을 스케줄링하는 데 사용됩니다. 이 단계는 기존에 스케줄링된 작업이 프로젝트의 현재 상태와 충돌하지 않도록 하기 위해 필요합니다.

 

여기서 크론(cron)이란? 크론은 시간 기반의 작업 스케줄러인데 여기서는 서버를 끊김 없이 계속 가동하기 위해 사용됩니다.  시간은 * * * * * 로 설정할 수 있는데 * 마다 분(0-59) 시간 (0-23) 일(1-31) 월(1-12) 요일(0-7) 형태로 지정되며 다양한 조합으로 구체적인 스케줄링이 가능합니다.

 

서버 상태 확인 및 재배포 또는 초기 배포: 스크립트는 PROJECT_PID 변수를 사용해 프로젝트가 현재 실행 중인지 확인합니다.

  • 재배포: 프로젝트가 실행 중인 경우, kill -9 명령어를 사용해 강제 종료합니다. 이는 새로운 버전으로의 전환을 위해 필요합니다.
  • 초기 배포: 프로젝트가 실행 중이지 않다면, 시스템 업데이트 (sudo apt-get -y update), JDK 설치 (sudo apt-get -y install openjdk-11-jdk), 그리고 시간대 설정 (sudo timedatectl set-timezone Asia/Seoul)을 수행합니다. 이 단계는 서버가 적절한 환경으로 설정되어 있고, 자바 애플리케이션이 실행될 준비가 되어 있도록 보장합니다.

시간 설정은 EC2서버의 OS 초기 시간설정이 한국시간보다 9시간 늦은 미국 시간으로 설정되어 있기 때문에 시간설정을 맞춰줍니다.

 

감사합니다.