[AWS] 기본적인 배포 스크립트
본 게시글은 [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시간 늦은 미국 시간으로 설정되어 있기 때문에 시간설정을 맞춰줍니다.
감사합니다.