이번 글은 개인 프로젝트(Han-Commerce) 목표 중 하나인 EC2 생성 후 CI/CD 자동화 배포를 진행 하기 전
git pull -> build -> 서버 재실행 과정을 자동화 해보는 법을 학습 후 적용 해보고 제 방식대로 정리해두기 위한 목적의 글입니다.
EC2 생성 후 스프링부트 소스 Build 하여 서버 실행까지 해본 상태라고 가정하며 정리합니다.
ubuntu OS입니다.
배포 순서 정리
- 프로젝트를 위치 시킬 경로를 지정 후 해당 경로로 이동합니다.
- git pull 명령어를 사용 해 최신 프로젝트 소스를 가져옵니다.
- gradle로 빌드를 진행합니다.
- 이미 실행중인 애플리케이션이 있으면 종료합니다.
- 애플리케이션을 실행하는데 필요한 환경변수를 세팅합니다.
- 애플리케이션을 실행합니다.
쉘 스크립트를 이용한 배포 자동화 진행
우선 자신이 원하는 경로에 쉘 스크립트 파일 생성부터 하겠습니다.(저는 aws 우분투 첫 경로(/home/ubuntu)에 진행했습니다. )
touch bapo.sh

bapo.sh 파일이 생성 된 걸 확인 할 수 있습니다. tip) 현재 내 경로 위치 확인 명령어 -> pwd
han-commerce-projects는 제가 이미 모든 과정을 적용 후 정리하는 글이라 만들어진 폴더이니 무시하시면 됩니다.
1. 프로젝트를 위치 시킬 경로를 지정 후 해당 경로로 이동합니다.
특정 경로를 지정하기 위해 해당 경로를 만드는 것은 최초 한 번만 진행하니 쉘 스크립트엔 작성하지 않습니다.
han-commerce-projects 폴더 경로에 프로젝트를 받아올 것이기 때문에 폴더를 만드는 명령어입니다.
mkdir han-commerce-projects
이 명령어를 사용하면 위의 이미지와 같이 han-comerce-projects 폴더가 생성됩니다.
그 후 해당 폴더 경로로 이동하는 명령어 cd 를 이용해 /home/ubuntu/han-commerce-projects 디렉토리로 이동하겠습니다.
cd /home/ubuntu/han-commerce-projects
프로젝트 폴더 경로로 이동하는 위 명령어는 배포 과정에서 반복되는 명령어이기 때문에 쉘 스크립트에 작성하도록 하겠습니다.
bapo.sh
PROJECT_PATH=/home/ubuntu/han-commerce-projects
echo -e "\n [$PROJECT_PATH] 경로로 이동합니다.\n"
cd $PROJECT_PATH
tip) echo 명령어만 사용하여 실행해보니 제 컴퓨터에선 \n(줄 개행) 기능이 적용되지 않아 echo -e로 명령어를 진행하니 줄개행 적용 됨.
bapo.sh 실행
./bapo.sh #해당 명령어 실행 후 권한 오류가 난다면
chmod +x ./bapo.sh #실행 권한 주는 명령어
쉘 스크립트에 작성한 "[프로젝트경로] 경로로 이동합니다." 문장이 나타난다면 실행 명령이 잘 적용 되었다는 것을 알 수 있습니다.
앞으로 실행 부분은 중복되니 처음 한번만 정리 하겠습니다.
2. git pull 명령어를 사용 해 최신 프로젝트 소스를 가져옵니다.
han-commerce-projects 디렉토리에 깃허브 프로젝트를 가져오는 명령어는 배포 과정 중 한 번만 진행되니
쉘 스크립트에 저장하지 않고 진행하겠습니다.
git clone 내 깃허브 레포지토리 주소

제 깃허브에서 프로젝트를 잘 가져온 걸 확인 할 수 있습니다.
앞으로 배포 과정 중 프로젝트가 변경 될 때마다 git에서 pull 명령어를 반복 사용하므로 쉘 스크립트에 작성하도록 하겠습니다.
bapo.sh
PROJECT_PATH=/home/ubuntu/han-commerce-projects
PROJECT_NAME=han-commerce
echo -e "\n [$PROJECT_PATH] 경로로 이동합니다.\n"
cd $PROJECT_PATH/$PROJECT_NAME
echo -e "\n 최신 코드를 PULL 합니다.\n"
git pull
3. gradle로 빌드를 실행합니다.
프로젝트 디렉토리 경로에서 빌드를 진행합니다.
./gradlew clean build
위 명령어 gradlew 은 gradle이 설치되지 않은 환경에서도 실행 할 수 있게 해주는 방법입니다.
tip) 제가 EC2 서버를 ubuntu 로 생성하여 사용하다가 data-transfer 부분이 프리티어 용량을 넘어 설 뻔한 문제를 겪어 ubuntu 패키지 관련 설치는 최대한 피하고 있습니다. 이 부분은 추후 블로그 글로 작성 해보겠습니다.
bapo.sh
PROJECT_PATH=/home/ubuntu/han-commerce-projects
PROJECT_NAME=han-commerce
echo -e "\n [$PROJECT_PATH] 경로로 이동합니다.\n"
cd $PROJECT_PATH/$PROJECT_NAME
echo -e "\n 최신 코드를 PULL 합니다.\n"
git pull
echo -e " 프로젝트를 새롭게 빌드합니다.\n"
./gradlew clean build
build 가 잘 된다면 /build/libs 경로에 jar 파일이 생성되 있는 것을 확인 할 수 있습니다.
(/home/ubuntu/han-commerce-projects/han-commerce/build/libs)

4. 이미 실행중인 애플리케이션이 있으면 종료합니다.
반복 사용되는 명령어이니 쉘 스크립트에 작성하도록 하겠습니다. 다만 이 명령어는 현재 애플리케이션이 실행중일 때만
적용될 수 있게 작성 해보겠습니다.
isof -i :8080 -t | xargs kill -15
bapo.sh
PROJECT_PATH=/home/ubuntu/han-commerce-projects
PROJECT_NAME=han-commerce
PORT=8080
echo -e "\n [$PROJECT_PATH] 경로로 이동합니다.\n"
cd $PROJECT_PATH/$PROJECT_NAME
echo -e "\n 최신 코드를 PULL 합니다.\n"
git pull
echo -e " 프로젝트를 새롭게 빌드합니다.\n"
./gradlew clean build
echo " [$PORT] 번 포트를 사용하는 애플리케이션을 찾습니다...\n"
PID=$(lsof -i :$PORT -t)
if [ -z $PID ]; then
echo -e " 실행중인 애플리케이션이 없어서 곧바로 실행합니다.\n"
else
echo -e " 실행중인 애플리케이션이 있어서 이를 종료합니다. [PID = $PID]\n"
kill -15 $PID
fi
5. 애플리케이션을 실행하는 데 필요한 환경변수를 셋팅합니다.
제 프로젝트는 깃허브에 DB 설정 정보의 보안을 위해 환경변수만 보이게끔 만들어서 코드에서 환경변수가 필요 할 때 사용하는 방법입니다.
DB 설정과 개발환경 운영 환경의 분리를 위해 spring-active를 사용해 배포에 적용하는 방법은
추후에 블로그에 정리 해 기록해 볼 생각입니다.
이번 글엔 쉘 스크립트에 어떤식으로 환경변수 값을 저장 할 수 있는지만 정리하도록 하겠습니다.
export ENVIRONMENT_VARIABLES = "환경 변수 값"
6. 애플리케이션을 실행합니다.
이제 애플리케이션을 실행해보겠습니다.
실행 명령어도 배포 과정 중 반복되니 쉘 스크립트에 작성 하겠습니다.
nohup java -jar [jar파일 이름(경로 포함)].jar &
bapo.sh
PROJECT_PATH=/home/ubuntu/han-commerce-projects
PROJECT_NAME=han-commerce
PORT=8080
BUILD_PATH=build/libs
JAR_NAME=hancommerce-0.0.1-SNAPSHOT.jar
echo -e "\n [$PROJECT_PATH] 경로로 이동합니다.\n"
cd $PROJECT_PATH/$PROJECT_NAME
echo -e "\n 최신 코드를 PULL 합니다.\n"
git pull
echo -e " 프로젝트를 새롭게 빌드합니다.\n"
./gradlew clean build
echo -e " [$PORT] 번 포트를 사용하는 애플리케이션을 찾습니다...\n"
PID=$(lsof -i :$PORT -t)
if [ -z $PID ]; then
echo -e " 실행중인 애플리케이션이 없어서 곧바로 실행합니다.\n"
else
echo -e " 실행중인 애플리케이션이 있어서 이를 종료합니다. [PID = $PID]\n"
kill -15 $PID
fi
echo -e " 애플리케이션 실행합니다~ \n"
nohup java -jar $PROJECT_PATH/$PROJECT_NAME/$BUILD_PATH/$JAR_NAME &
끝내며
CI/CD 자동 배포화를 적용 해 보기 위해 관련 개념을 공부하며 블로그를 살피다가
말랑님(하단 출처 블로그 주소 참고) 의 글을 읽게 되었는데 CI/CD 자동 배포 전 쉘 스크립트로 배포 과정을
자동화 하는 방법을 적용해보면 배포 과정에 대해 이해하고 적용하는 데 많은 도움이 될 거 같아 시작하게 되었습니다.
그리고 적용해 본 이후 배포 과정을 이해하는 데 정말 많은 도움이 되어 이렇게 정리 해 놓고 싶어 블로그 글을 작성 해봤습니다.
다음 글에선 제가 EC2를 생성하며 겪었던 프리티어 용량 문제와 스프링 부트 프로젝트에서
dev 모드와 prod모드를 분리하여 적용하는 방법을 기록 해 보겠습니다.