1. 배포 쉘 스크립트 작성하기
CI/CD가 구축되지 않은 상황에서 변경사항을일일이 갱신해주고 재배포해주는 과정은 매우 번거롭다. CI/CD를 구축하는 것이 가장 현명한 방법이겠지만 '쉘 스크립트'를 사용하여 생산성을 높여보자!!
(1) 실행중인 애플리케이션 종료
현재 배포된 애플리케이션이 있다면 종료시키자! kill -15 명령어를 통해 서버를 중단시키는 것이 안정적이지만 시간이 너무 오래 소요된다면 kill -9를 통해 강제종료시키기로 하자!
- kill - 9 (SIGKILL)
- SIGKILL (Signal Kill) : 강제 종료 시그널로, 즉시 프로세스를 종료시킨다. 프로세스는 이 시그널을 무시하거나 이를 처리할 기회를 가지지 않는다.
- 강제종료 방법은 프로세스가 정상적으로 종료되지 않거나 응답하지 않을 때 유용하다.
- 단, 프로세스가 정리 작업을 수행할 기회가 없기에 데이터 손실이나 파일 손상이 발생할 수 있다.
- kill -15 (SIGTERM)
- SIGTERM (Signal Terminate) : 기본 종료 시그널로, 프로세스가 종료되기 전에 정리할 시간을 준다. 프로세스는 이 시그널을 수신했을 때, 이를 처리하는 핸들러를 가지고 있다면 정리 작업을 수행할 수 있다.
- 열린 파일을 닫거나, 임시 파일을 삭제하거나, 데이터베이스 연결을 정리하는 깨끗하게 작업을 종료할 수 있다.
- 대부분의 경우, 애플리케이션이 정상적으로 종료되도록 유도하기에 안전한 종료 방법이다.
# JAR 파일 이름 설정
JAR_NAME=spring-gift-1.0-SNAPSHOT.jar
# 현재 실행 중인 애플리케이션의 PID를 가져온다.
CURRENT_PID=$(pgrep -f $JAR_NAME)
# 1. 실행 중인 애플리케이션이 있으면 종료시킨다.
if [ -z $CURRENT_PID ]
then
echo "[1] 현재 배포된 서버가 없습니다."
echo "[2] 종료시킬 애플리케이션이 없습니다."
else
echo "[1] 현재 배포된 서버를 중단시킵니다. 현재 배포된 서버의 PID: $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 10
# 2. 프로세스가 아직 종료되지 않았는지 확인한다.
CURRENT_PID=$(pgrep -f $JAR_NAME)
if [ -z $CURRENT_PID ]
then
echo "[2] 애플리케이션이 성공적으로 종료되었습니다."
else
echo "[2] 애플리케이션이 아직 종료되지 않았기에 강제 종료합니다. 현재 배포된 서버의 PID : $CURRENT_PID"
kill -9 $CURRENT_PID
sleep 2
fi
fi
(2) 변경사항 가져오기
# 3. git pull을 통해 변경사항 가져오기
echo "[3] git pull을 통해 소스코드를 최신 상태로 업데이트합니다."
cd /home/ubuntu/spring-gift-point
git pull
(3) 기존 빌드 폴더 삭제 후 새로운 빌드 수행
# 4. 기존 빌드 폴더 삭제
echo "[4] 기존 빌드 폴더를 삭제합니다."
# 5. 새로운 빌드 수행
echo "[5] 새로운 빌드를 시작합니다."
./gradlew build
(4) 새로운 애플리케이션 실행
# 빌드된 JAR 파일 경로 설정
BUILD_PATH=$(ls build/libs/*SNAPSHOT.jar | grep -v 'plain')
JAR_NAME=$(basename $BUILD_PATH)
# 6. 새로운 애플리케이션 실행
echo "[6] 배포 시작!! 새로운 애플리케이션을 실행합니다. JAR 파일명: $JAR_NAME"
cd build/libs
nohup java -jar $JAR_NAME > output.log 2>&1 &
echo "[7] 배포가 완료되었습니다."
최종 코드는 다음과 같다!!
#!/bin/bash
# JAR 파일 이름 설정
JAR_NAME=spring-gift-1.0-SNAPSHOT.jar
# 현재 실행 중인 애플리케이션의 PID를 가져온다.
CURRENT_PID=$(pgrep -f $JAR_NAME)
# 1. 실행 중인 애플리케이션이 있으면 종료시킨다.
if [ -z $CURRENT_PID ]
then
echo "[1] 현재 배포된 서버가 없습니다."
echo "[2] 종료시킬 애플리케이션이 없습니다."
else
echo "[1] 현재 배포된 서버를 중단시킵니다. 현재 배포된 서버의 PID: $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
# 2. 프로세스가 아직 종료되지 않았는지 확인한다.
CURRENT_PID=$(pgrep -f $JAR_NAME)
if [ -z $CURRENT_PID ]
then
echo "[2] 애플리케이션이 성공적으로 종료되었습니다."
else
echo "[2] 애플리케이션이 아직 종료되지 않았기에 강제 종료합니다. 현재 배포된 서버의 PID : $CURRENT_PID"
kill -9 $CURRENT_PID
sleep 2
fi
fi
# 3. git pull을 통해 변경사항 가져오기
echo "[3] git pull을 통해 소스코드를 최신 상태로 업데이트합니다."
cd /home/ubuntu/spring-gift-point
git pull
# 4. 기존 빌드 폴더 삭제
echo "[4] 기존 빌드 폴더를 삭제합니다."
# 5. 새로운 빌드 수행
echo "[5] 새로운 빌드를 시작합니다."
./gradlew build
# 빌드된 JAR 파일 경로 설정
BUILD_PATH=$(ls build/libs/*SNAPSHOT.jar | grep -v 'plain')
JAR_NAME=$(basename $BUILD_PATH)
# 6. 새로운 애플리케이션 실행
echo "[6] 배포 시작!! 새로운 애플리케이션을 실행합니다. JAR 파일명: $JAR_NAME"
cd build/libs
nohup java -jar $JAR_NAME > output.log 2>&1 &
echo "[7] 배포가 완료되었습니다."
1,1 Top
+) 쉘 스크립트 최상단에 #!/bin/bash 작성 이유
이 스크립트가 Bash 쉘에서 실행되도록 지정하기 위해서이다. 이를 '쉐뱅(shebang)'이라고 부르며, 스크립트 파일이 어떤 인터프리터를 사용해야 하는지 시스템에 알려주는 역할을 한다. 즉, Bash 인터프리터에서 실행되도록 보장한다.
2. EC2 환경에서 메모리가 부족할 때 가상 메모리 기법 사용하기
AWS EC2 환경에서 인스턴스 유형으로 t2.micro를 사용하면 build가 너무 느려 먹통이 되는 경우가 많다. 이를 해결하기 위해 시스템의 가상 메모리(스왑 공간)을 설정하여, 메모리가 부족할 때 디스크의 일부를 메모리처럼 사용하여 해결할 수 있다.
(1) 스왑 파일 생성
현재 메모리와 디스크 스펙은 다음과 같다.
## 1. dd 명령어를 통해 2G의 스왑 파일을 만들기
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
## 2. fallocate 명령어를 통해 2G의 스왑 파일을 만들기
sudo fallocate -l 2G /swapfile
dd 명령어의 경우 /dev/zero로부터 파일을 읽고 쓰는데 빈 공간을 null값으로 가득 채우는 반면 fallocate의 경우 설정한 공간만큼만 할당해주는 작업만 하므로 fallocate의 방법이 더욱 빠른 방법이다.
(2) 스왑 파일의 권한 설정
sudo chmod 600 /swapfile
생성된 스왑 파일(swapfile)의 권한을 설정해준다. 600은 파일 소유자만 읽기와 쓰기 권한을 가지게 되며 다른 상요자들이 해당 파일에 접근하지 못하도록 하는 권한 설정이다.
(3) 스왑 공간 설정
sudo mkswap /swapfile
swapfile을 스왑 영역으로 초기화한다. mkswap 명령어는 지정된 파일을 스왑 공간으로 사용할 수 있도록 설정하는 역할을 한다.
(4) 스왑 공간 활성화
sudo swapon /swapfile
위 명령어를 통해 스왑 파일을 화성화하여 시스템이 실제로 이 파일을 스왑 공간으로 사용할 수 있도록 한다. 활성화된 스왑 파일은 시스템 메모리가 부족할 때 자동으로 사용된다.
위와 같이 스왑 공간이 늘어났음을 알 수 있다!!! 다만 재부팅할 때마다 다시 활성화시켜주어야한다는 번거로움이 있다.. 재부팅할 때마다 자동으로 스왑 공간을 활성하기를 원한다면 /etc/fstab 파일에 다음과 같은 명령어를 추가해주어야 한다.
/swapfile swap swap defaults 0 0
(5) 스왑 영역 비활성화 및 삭제
swapoff 명령어를 통해 스왑 공간을 간단히 비활성화할 수 있다. 또한 /etc/fstab 파일에 추가한 명령어 또한 삭제해주면 된다.
'Backend > 인프라' 카테고리의 다른 글
[AWS] 프로젝트 EC2 배포하기 (0) | 2024.08.16 |
---|