AWS에서 프로젝트를 배포할 때는 프로젝트 수정마다 동일한 배포 과정을 반복해야 한다. 이를 자동화하면 시간을 절약하고, 더 효율적으로 관리할 수 있다. 필요한 쉘 스크립트를 작성해 배포 자동화 방법을 알아보자.
git pull
로 프로젝트 업데이트이 모든 단계를 자동화하기 위해 deploy.sh
스크립트를 생성하고 다음과 같이 작성한다.
#!/bin/bash
REPOSITORY=/home/ec2-user/app/{clone한 프로젝트 저장한 경로}
PROJECT_NAME={프로젝트명}
cd $REPOSITORY/$PROJECT_NAME/
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작"
./gradlew build
echo "> step1 디렉토리로 이동"
cd $REPOSITORY
echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)
echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않는다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,classpath:/application-real.properties,/home/ec2-user/app/application-oauth.properties,/home/ec2-user/app/application-real-db.properties \
-Dspring.profiles.active=real \
$REPOSITORY/$JAR_NAME 2>&1 &
참고: 스크립트에 포함된 경로는 사용자 환경에 따라 달라질 수 있으니 반드시 확인 후 설정한다.
REPOSITORY=/home/ec2-user/app/{clone한 프로젝트 저장한 경로}
PROJECT_NAME={프로젝트명}
프로젝트명과 프로젝트 경로를 변수로 저장해 자주 사용하는 값을 쉽게 참조하도록 한다.
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작"
./gradlew build
echo "> step1 디렉토리로 이동"
cd $REPOSITORY
echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
프로젝트의 변경사항을 EC2 서버에 반영하기 위해 git pull
로 업데이트를 진행하고, 이후 프로젝트를 빌드한 후 생성된 .jar
파일을 지정된 경로로 복사해준다.
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)
echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않는다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
구동 중인 프로젝트가 있으면 종료한 후 새로운 배포를 진행한다. pgrep
명령어로 현재 실행 중인 애플리케이션의 pid
를 가져와, 존재하면 종료(kill -15)
하는 방식으로 동작한다.
echo "> JAR Name: $JAR_NAME"
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,classpath:/application-real.properties,/home/ec2-user/app/application-oauth.properties,/home/ec2-user/app/application-real-db.properties \
-Dspring.profiles.active=real \
$REPOSITORY/$JAR_NAME 2>&1 &
nohup
명령어로 터미널 종료 후에도 애플리케이션이 계속 구동되도록 한다. -Dspring.config.location
옵션은 .gitignore
로 제외된 보안 파일들과 jar 내부 properties 파일을 적용하기 위한 경로 설정이다.
예시 경로:
application-oauth.properties
와application-real-db.properties
는 EC2 서버에 절대경로로 설정하여 프로젝트 외부에 존재한다.
이제 프로젝트에 수정사항이 생기면, EC2 서버에서 deploy.sh
스크립트를 실행하여 자동으로 배포할 수 있다. 이러한 자동화로 배포의 효율성을 높이고, EC2 서버에서의 배포 작업을 보다 간편하게 처리할 수 있다.